@chance722/dsh-inbox 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,532 @@
1
+ /**
2
+ * The panel's copy, in the two languages dsh itself ships.
3
+ *
4
+ * Chinese is the primary UI language (`src/shared/vocabulary.ts` says so for
5
+ * the host's own labels too), so the `zh` side is what the panel said before it
6
+ * had a language at all, and the `en` side is what a reader who switched dsh to
7
+ * English gets. Both sides carry **the same keys** — `test/i18n.test.ts` fails
8
+ * if they drift apart, and if a key is ever missing the lookup falls back to
9
+ * the key itself rather than to a blank line.
10
+ *
11
+ * Placeholders are `{name}` and are filled by `t()`; keep the braces in both
12
+ * languages even when the surrounding word order changes.
13
+ *
14
+ * **What this file does not cover**: the strings the *host* half sends over the
15
+ * wire (probe verdicts, sync errors) and the labels the model sees in tool
16
+ * output. Those travel through `src/shared/**`, are the same in both halves, and
17
+ * need a code-based contract before they can follow a reader's language — see
18
+ * `docs/help/panel-i18n.md`.
19
+ */
20
+ /** One dictionary: flat key to template string. */
21
+ export type Dictionary = Record<string, string>;
22
+ /** The Chinese side — what the panel said before it could switch. */
23
+ export declare const zh: {
24
+ 'heading.untitled': string;
25
+ 'heading.credential': string;
26
+ 'heading.tooltip': string;
27
+ 'kind.text': string;
28
+ 'kind.link': string;
29
+ 'kind.image': string;
30
+ 'kind.file': string;
31
+ 'category.idea': string;
32
+ 'category.article': string;
33
+ 'category.media': string;
34
+ 'category.image': string;
35
+ 'category.document': string;
36
+ 'category.secret': string;
37
+ 'category.other': string;
38
+ 'source.rule': string;
39
+ 'source.model': string;
40
+ 'source.user': string;
41
+ 'source.rule.hint': string;
42
+ 'source.model.hint': string;
43
+ 'source.user.hint': string;
44
+ 'link.noTitle': string;
45
+ 'link.http': string;
46
+ 'link.notHtml': string;
47
+ 'link.unreachable': string;
48
+ 'link.unknown': string;
49
+ 'app.settings': string;
50
+ 'app.manual': string;
51
+ 'app.counts': string;
52
+ 'app.refresh': string;
53
+ 'app.refreshing': string;
54
+ 'app.loading': string;
55
+ 'app.saving': string;
56
+ 'app.filter': string;
57
+ 'app.store': string;
58
+ 'app.pickFile': string;
59
+ 'app.close': string;
60
+ 'app.remove': string;
61
+ 'app.prevPage': string;
62
+ 'app.nextPage': string;
63
+ 'pager.of': string;
64
+ 'app.category': string;
65
+ 'app.tag': string;
66
+ 'app.emptyBox': string;
67
+ 'app.detail': string;
68
+ 'app.noMatches': string;
69
+ 'app.binEmpty': string;
70
+ 'app.matches': string;
71
+ 'app.attachments': string;
72
+ 'app.failedCount': string;
73
+ 'app.pickOne': string;
74
+ 'app.unnamedFile': string;
75
+ 'capture.placeholder': string;
76
+ 'search.placeholder': string;
77
+ 'modes.label': string;
78
+ 'modes.titleOf': string;
79
+ 'modes.grid': string;
80
+ 'modes.compact': string;
81
+ 'filter.all': string;
82
+ 'filter.watch': string;
83
+ 'filter.bin': string;
84
+ 'filter.clearBin': string;
85
+ 'filter.untagAll': string;
86
+ 'detail.name': string;
87
+ 'detail.nameTitle': string;
88
+ 'detail.namePlaceholder': string;
89
+ 'detail.note': string;
90
+ 'detail.noteTitle': string;
91
+ 'detail.notePlaceholder': string;
92
+ 'detail.tagsPlaceholder': string;
93
+ 'detail.save': string;
94
+ 'detail.watch': string;
95
+ 'detail.unwatch': string;
96
+ 'detail.restore': string;
97
+ 'detail.delete': string;
98
+ 'detail.removeTag': string;
99
+ 'detail.updated': string;
100
+ 'detail.sealedNote': string;
101
+ 'detail.titleMissed': string;
102
+ 'detail.play': string;
103
+ 'detail.zoom': string;
104
+ 'detail.playInBrowser': string;
105
+ 'detail.openInBrowser': string;
106
+ 'detail.zoomInPanel': string;
107
+ 'detail.foreign': string;
108
+ 'detail.foreignBody': string;
109
+ 'settings.secrets': string;
110
+ 'settings.secretsBody': string;
111
+ 'settings.masterPassword': string;
112
+ 'settings.masterPasswordSet': string;
113
+ 'settings.masterPasswordNew': string;
114
+ 'settings.unlock': string;
115
+ 'settings.lock': string;
116
+ 'settings.setOrChange': string;
117
+ 'settings.unlocked': string;
118
+ 'settings.locked': string;
119
+ 'settings.lockedNote': string;
120
+ 'settings.noPassword': string;
121
+ 'settings.passwordJustSet': string;
122
+ 'settings.passwordSealed': string;
123
+ 'settings.ingest': string;
124
+ 'settings.ingestOnly': string;
125
+ 'settings.protocol': string;
126
+ 'settings.protocolHint': string;
127
+ 'settings.endpoint': string;
128
+ 'settings.endpointPlaceholder': string;
129
+ 'settings.region': string;
130
+ 'settings.bucketAddress': string;
131
+ 'settings.bucketDir': string;
132
+ 'settings.dirS3.lead': string;
133
+ 'settings.dirS3.mid': string;
134
+ 'settings.dirS3.tail': string;
135
+ 'settings.clientId': string;
136
+ 'settings.clientIdS3': string;
137
+ 'settings.clientIdWebdav': string;
138
+ 'settings.username': string;
139
+ 'settings.password': string;
140
+ 'settings.passwordStored': string;
141
+ 'settings.passwordStore': string;
142
+ 'settings.signature': string;
143
+ 'settings.signatureV2': string;
144
+ 'settings.save': string;
145
+ 'settings.probe': string;
146
+ 'settings.details': string;
147
+ 'settings.noServiceBody': string;
148
+ 'settings.bucketHint': string;
149
+ 'notice.listFailed': string;
150
+ 'notice.listUnreadable': string;
151
+ 'notice.detailFailed': string;
152
+ 'notice.responseUnreadable': string;
153
+ 'notice.captureEmpty': string;
154
+ 'notice.captureFailed': string;
155
+ 'notice.saved': string;
156
+ 'notice.merged': string;
157
+ 'notice.restored': string;
158
+ 'notice.settingsSaved': string;
159
+ 'notice.settingsUnreadable': string;
160
+ 'notice.settingsFailed': string;
161
+ 'notice.probeFailed': string;
162
+ 'notice.probeDone': string;
163
+ 'notice.syncing': string;
164
+ 'notice.pushFailed': string;
165
+ 'notice.pullFailed': string;
166
+ 'notice.tagRemoved': string;
167
+ 'notice.tagRemoveFailed': string;
168
+ 'notice.purgeFailed': string;
169
+ 'notice.purgeNoRemote': string;
170
+ 'notice.purgeRemote': string;
171
+ 'notice.purgeDone': string;
172
+ 'notice.purgeFailedAtRemote': string;
173
+ 'confirm.untag': string;
174
+ 'confirm.purge': string;
175
+ 'sync.pushUnconfigured': string;
176
+ 'sync.pushFailed': string;
177
+ 'sync.pushUnknown': string;
178
+ 'sync.pushUpToDate': string;
179
+ 'sync.pushDone': string;
180
+ 'sync.pushPartial': string;
181
+ 'sync.pullNoAddress': string;
182
+ 'sync.pullFailed': string;
183
+ 'sync.pullNothingNew': string;
184
+ 'sync.pullMerged': string;
185
+ 'sync.pullAttachments': string;
186
+ 'sync.pullDone': string;
187
+ 'sync.pullFailedCount': string;
188
+ 'sync.thisPage': string;
189
+ 'settings.status': string;
190
+ 'settings.statusOn': string;
191
+ 'settings.statusOff': string;
192
+ 'settings.statusWebdavSet': string;
193
+ 'settings.statusWebdavUnset': string;
194
+ 'settings.statusS3Set': string;
195
+ 'settings.statusS3Unset': string;
196
+ 'card.openThis': string;
197
+ 'card.searchTitle': string;
198
+ 'card.getTitle': string;
199
+ 'card.error': string;
200
+ 'card.open': string;
201
+ 'card.pending': string;
202
+ 'dock.title': string;
203
+ 'dock.description': string;
204
+ 'dock.recent': string;
205
+ 'dock.watch': string;
206
+ 'dock.back': string;
207
+ 'dock.backShort': string;
208
+ 'dock.note': string;
209
+ 'dock.unavailable': string;
210
+ 'dock.hint': string;
211
+ 'dock.gone': string;
212
+ 'dock.editHint': string;
213
+ 'manual.title': string;
214
+ 'manual.titleInline': string;
215
+ 'manual.lead': string;
216
+ 'manual.separator': string;
217
+ 'manual.1.title': string;
218
+ 'manual.1.panel.label': string;
219
+ 'manual.1.panel.body': string;
220
+ 'manual.1.chat.label': string;
221
+ 'manual.1.chat.lead': string;
222
+ 'manual.1.chat.code': string;
223
+ 'manual.1.chat.tail': string;
224
+ 'manual.1.repeat.label': string;
225
+ 'manual.1.repeat.body': string;
226
+ 'manual.2.title': string;
227
+ 'manual.2.filter.label': string;
228
+ 'manual.2.filter.body': string;
229
+ 'manual.2.list.label': string;
230
+ 'manual.2.list.body': string;
231
+ 'manual.2.detail.label': string;
232
+ 'manual.2.detail.body': string;
233
+ 'manual.3.title': string;
234
+ 'manual.3.order.label': string;
235
+ 'manual.3.order.body': string;
236
+ 'manual.3.icon.label': string;
237
+ 'manual.3.icon.tail': string;
238
+ 'manual.3.who.label': string;
239
+ 'manual.3.who.lead': string;
240
+ 'manual.3.who.tail': string;
241
+ 'manual.4.title': string;
242
+ 'manual.4.password.label': string;
243
+ 'manual.4.password.body': string;
244
+ 'manual.4.unlock.label': string;
245
+ 'manual.4.unlock.body': string;
246
+ 'manual.4.never.label': string;
247
+ 'manual.4.never.body': string;
248
+ 'manual.5.title': string;
249
+ 'manual.5.auto.label': string;
250
+ 'manual.5.auto.body': string;
251
+ 'manual.5.manual.label': string;
252
+ 'manual.5.manual.body': string;
253
+ 'manual.5.delete.label': string;
254
+ 'manual.5.delete.body': string;
255
+ 'manual.5.conflict.label': string;
256
+ 'manual.5.conflict.body': string;
257
+ 'manual.6.title': string;
258
+ 'manual.6.query.label': string;
259
+ 'manual.6.query.body': string;
260
+ 'manual.6.get.label': string;
261
+ 'manual.6.get.body': string;
262
+ 'manual.6.refuse.label': string;
263
+ 'manual.6.refuse.body': string;
264
+ 'manual.6.tools.label': string;
265
+ 'manual.6.tools.body': string;
266
+ 'manual.7.title': string;
267
+ 'manual.7.title.label': string;
268
+ 'manual.7.title.body': string;
269
+ 'manual.7.zero.label': string;
270
+ 'manual.7.zero.body': string;
271
+ 'manual.7.sync.label': string;
272
+ 'manual.7.sync.body': string;
273
+ };
274
+ /** The English side. Same keys as {@link zh}; `test/i18n.test.ts` enforces it. */
275
+ export declare const en: Dictionary;
276
+ /** Every key, in the order the dictionary declares them. */
277
+ export type MessageKey = keyof typeof zh;
278
+ /** Both shipped dictionaries, keyed by the ids dsh itself uses. */
279
+ export declare const MESSAGES: {
280
+ readonly zh: {
281
+ 'heading.untitled': string;
282
+ 'heading.credential': string;
283
+ 'heading.tooltip': string;
284
+ 'kind.text': string;
285
+ 'kind.link': string;
286
+ 'kind.image': string;
287
+ 'kind.file': string;
288
+ 'category.idea': string;
289
+ 'category.article': string;
290
+ 'category.media': string;
291
+ 'category.image': string;
292
+ 'category.document': string;
293
+ 'category.secret': string;
294
+ 'category.other': string;
295
+ 'source.rule': string;
296
+ 'source.model': string;
297
+ 'source.user': string;
298
+ 'source.rule.hint': string;
299
+ 'source.model.hint': string;
300
+ 'source.user.hint': string;
301
+ 'link.noTitle': string;
302
+ 'link.http': string;
303
+ 'link.notHtml': string;
304
+ 'link.unreachable': string;
305
+ 'link.unknown': string;
306
+ 'app.settings': string;
307
+ 'app.manual': string;
308
+ 'app.counts': string;
309
+ 'app.refresh': string;
310
+ 'app.refreshing': string;
311
+ 'app.loading': string;
312
+ 'app.saving': string;
313
+ 'app.filter': string;
314
+ 'app.store': string;
315
+ 'app.pickFile': string;
316
+ 'app.close': string;
317
+ 'app.remove': string;
318
+ 'app.prevPage': string;
319
+ 'app.nextPage': string;
320
+ 'pager.of': string;
321
+ 'app.category': string;
322
+ 'app.tag': string;
323
+ 'app.emptyBox': string;
324
+ 'app.detail': string;
325
+ 'app.noMatches': string;
326
+ 'app.binEmpty': string;
327
+ 'app.matches': string;
328
+ 'app.attachments': string;
329
+ 'app.failedCount': string;
330
+ 'app.pickOne': string;
331
+ 'app.unnamedFile': string;
332
+ 'capture.placeholder': string;
333
+ 'search.placeholder': string;
334
+ 'modes.label': string;
335
+ 'modes.titleOf': string;
336
+ 'modes.grid': string;
337
+ 'modes.compact': string;
338
+ 'filter.all': string;
339
+ 'filter.watch': string;
340
+ 'filter.bin': string;
341
+ 'filter.clearBin': string;
342
+ 'filter.untagAll': string;
343
+ 'detail.name': string;
344
+ 'detail.nameTitle': string;
345
+ 'detail.namePlaceholder': string;
346
+ 'detail.note': string;
347
+ 'detail.noteTitle': string;
348
+ 'detail.notePlaceholder': string;
349
+ 'detail.tagsPlaceholder': string;
350
+ 'detail.save': string;
351
+ 'detail.watch': string;
352
+ 'detail.unwatch': string;
353
+ 'detail.restore': string;
354
+ 'detail.delete': string;
355
+ 'detail.removeTag': string;
356
+ 'detail.updated': string;
357
+ 'detail.sealedNote': string;
358
+ 'detail.titleMissed': string;
359
+ 'detail.play': string;
360
+ 'detail.zoom': string;
361
+ 'detail.playInBrowser': string;
362
+ 'detail.openInBrowser': string;
363
+ 'detail.zoomInPanel': string;
364
+ 'detail.foreign': string;
365
+ 'detail.foreignBody': string;
366
+ 'settings.secrets': string;
367
+ 'settings.secretsBody': string;
368
+ 'settings.masterPassword': string;
369
+ 'settings.masterPasswordSet': string;
370
+ 'settings.masterPasswordNew': string;
371
+ 'settings.unlock': string;
372
+ 'settings.lock': string;
373
+ 'settings.setOrChange': string;
374
+ 'settings.unlocked': string;
375
+ 'settings.locked': string;
376
+ 'settings.lockedNote': string;
377
+ 'settings.noPassword': string;
378
+ 'settings.passwordJustSet': string;
379
+ 'settings.passwordSealed': string;
380
+ 'settings.ingest': string;
381
+ 'settings.ingestOnly': string;
382
+ 'settings.protocol': string;
383
+ 'settings.protocolHint': string;
384
+ 'settings.endpoint': string;
385
+ 'settings.endpointPlaceholder': string;
386
+ 'settings.region': string;
387
+ 'settings.bucketAddress': string;
388
+ 'settings.bucketDir': string;
389
+ 'settings.dirS3.lead': string;
390
+ 'settings.dirS3.mid': string;
391
+ 'settings.dirS3.tail': string;
392
+ 'settings.clientId': string;
393
+ 'settings.clientIdS3': string;
394
+ 'settings.clientIdWebdav': string;
395
+ 'settings.username': string;
396
+ 'settings.password': string;
397
+ 'settings.passwordStored': string;
398
+ 'settings.passwordStore': string;
399
+ 'settings.signature': string;
400
+ 'settings.signatureV2': string;
401
+ 'settings.save': string;
402
+ 'settings.probe': string;
403
+ 'settings.details': string;
404
+ 'settings.noServiceBody': string;
405
+ 'settings.bucketHint': string;
406
+ 'notice.listFailed': string;
407
+ 'notice.listUnreadable': string;
408
+ 'notice.detailFailed': string;
409
+ 'notice.responseUnreadable': string;
410
+ 'notice.captureEmpty': string;
411
+ 'notice.captureFailed': string;
412
+ 'notice.saved': string;
413
+ 'notice.merged': string;
414
+ 'notice.restored': string;
415
+ 'notice.settingsSaved': string;
416
+ 'notice.settingsUnreadable': string;
417
+ 'notice.settingsFailed': string;
418
+ 'notice.probeFailed': string;
419
+ 'notice.probeDone': string;
420
+ 'notice.syncing': string;
421
+ 'notice.pushFailed': string;
422
+ 'notice.pullFailed': string;
423
+ 'notice.tagRemoved': string;
424
+ 'notice.tagRemoveFailed': string;
425
+ 'notice.purgeFailed': string;
426
+ 'notice.purgeNoRemote': string;
427
+ 'notice.purgeRemote': string;
428
+ 'notice.purgeDone': string;
429
+ 'notice.purgeFailedAtRemote': string;
430
+ 'confirm.untag': string;
431
+ 'confirm.purge': string;
432
+ 'sync.pushUnconfigured': string;
433
+ 'sync.pushFailed': string;
434
+ 'sync.pushUnknown': string;
435
+ 'sync.pushUpToDate': string;
436
+ 'sync.pushDone': string;
437
+ 'sync.pushPartial': string;
438
+ 'sync.pullNoAddress': string;
439
+ 'sync.pullFailed': string;
440
+ 'sync.pullNothingNew': string;
441
+ 'sync.pullMerged': string;
442
+ 'sync.pullAttachments': string;
443
+ 'sync.pullDone': string;
444
+ 'sync.pullFailedCount': string;
445
+ 'sync.thisPage': string;
446
+ 'settings.status': string;
447
+ 'settings.statusOn': string;
448
+ 'settings.statusOff': string;
449
+ 'settings.statusWebdavSet': string;
450
+ 'settings.statusWebdavUnset': string;
451
+ 'settings.statusS3Set': string;
452
+ 'settings.statusS3Unset': string;
453
+ 'card.openThis': string;
454
+ 'card.searchTitle': string;
455
+ 'card.getTitle': string;
456
+ 'card.error': string;
457
+ 'card.open': string;
458
+ 'card.pending': string;
459
+ 'dock.title': string;
460
+ 'dock.description': string;
461
+ 'dock.recent': string;
462
+ 'dock.watch': string;
463
+ 'dock.back': string;
464
+ 'dock.backShort': string;
465
+ 'dock.note': string;
466
+ 'dock.unavailable': string;
467
+ 'dock.hint': string;
468
+ 'dock.gone': string;
469
+ 'dock.editHint': string;
470
+ 'manual.title': string;
471
+ 'manual.titleInline': string;
472
+ 'manual.lead': string;
473
+ 'manual.separator': string;
474
+ 'manual.1.title': string;
475
+ 'manual.1.panel.label': string;
476
+ 'manual.1.panel.body': string;
477
+ 'manual.1.chat.label': string;
478
+ 'manual.1.chat.lead': string;
479
+ 'manual.1.chat.code': string;
480
+ 'manual.1.chat.tail': string;
481
+ 'manual.1.repeat.label': string;
482
+ 'manual.1.repeat.body': string;
483
+ 'manual.2.title': string;
484
+ 'manual.2.filter.label': string;
485
+ 'manual.2.filter.body': string;
486
+ 'manual.2.list.label': string;
487
+ 'manual.2.list.body': string;
488
+ 'manual.2.detail.label': string;
489
+ 'manual.2.detail.body': string;
490
+ 'manual.3.title': string;
491
+ 'manual.3.order.label': string;
492
+ 'manual.3.order.body': string;
493
+ 'manual.3.icon.label': string;
494
+ 'manual.3.icon.tail': string;
495
+ 'manual.3.who.label': string;
496
+ 'manual.3.who.lead': string;
497
+ 'manual.3.who.tail': string;
498
+ 'manual.4.title': string;
499
+ 'manual.4.password.label': string;
500
+ 'manual.4.password.body': string;
501
+ 'manual.4.unlock.label': string;
502
+ 'manual.4.unlock.body': string;
503
+ 'manual.4.never.label': string;
504
+ 'manual.4.never.body': string;
505
+ 'manual.5.title': string;
506
+ 'manual.5.auto.label': string;
507
+ 'manual.5.auto.body': string;
508
+ 'manual.5.manual.label': string;
509
+ 'manual.5.manual.body': string;
510
+ 'manual.5.delete.label': string;
511
+ 'manual.5.delete.body': string;
512
+ 'manual.5.conflict.label': string;
513
+ 'manual.5.conflict.body': string;
514
+ 'manual.6.title': string;
515
+ 'manual.6.query.label': string;
516
+ 'manual.6.query.body': string;
517
+ 'manual.6.get.label': string;
518
+ 'manual.6.get.body': string;
519
+ 'manual.6.refuse.label': string;
520
+ 'manual.6.refuse.body': string;
521
+ 'manual.6.tools.label': string;
522
+ 'manual.6.tools.body': string;
523
+ 'manual.7.title': string;
524
+ 'manual.7.title.label': string;
525
+ 'manual.7.title.body': string;
526
+ 'manual.7.zero.label': string;
527
+ 'manual.7.zero.body': string;
528
+ 'manual.7.sync.label': string;
529
+ 'manual.7.sync.body': string;
530
+ };
531
+ readonly en: Dictionary;
532
+ };
@@ -2,12 +2,16 @@
2
2
  * The model fallback: one small call, only when a rule could not decide, always
3
3
  * redacted, always capped.
4
4
  *
5
- * Three things this file refuses to do:
6
- * - it never sends an image (the only way to judge an ID document from a
7
- * picture is the picture, and that is exactly what must not leave);
8
- * - it never sends credential text (`redact()` runs first, and a record whose
5
+ * What it does and does not send:
6
+ * - **an image record's bytes do go** this is the one place the plugin hands
7
+ * a picture to the model, and it is deliberate: a phone snapshot of an ID
8
+ * document has a photo's aspect ratio, so only the picture can decide, and
9
+ * the user authorised exactly this on 2026-09-19 (`AGENTS.md` 4). Nothing
10
+ * else about the record travels with it;
11
+ * - **credential text never goes** (`redact()` runs first, and a record whose
9
12
  * rule verdict is already `secret` is never asked about at all);
10
- * - it never overrides the user, or a rule that already decided.
13
+ * - **the user always wins** — a verdict they set, or one a rule already
14
+ * decided, is never overwritten, and the daily cap outranks a pending call.
11
15
  *
12
16
  * Spending is capped per local day and persisted in the vault's global slot, so
13
17
  * a restart cannot reset the meter.