@taskless-app/shared 0.1.47 → 0.1.48

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.
@@ -7,6 +7,30 @@ export type DeliveryLevel = "feed" | "counter" | "push";
7
7
  * builders.ts и падает, если вид оттуда здесь не объявлен.
8
8
  */
9
9
  export declare const DELIVERY_LEVELS: Readonly<Record<string, DeliveryLevel>>;
10
+ /**
11
+ * Виды, которые УМЕЮТ письмо (PRJ-132).
12
+ *
13
+ * Второе свойство вида — рядом с уровнем доставки и по той же причине: канал,
14
+ * объявленный не там, где живёт сам вид, разъезжается с кодом отправки, а
15
+ * разъезд здесь означает недостижимую настройку. Экран настроек показывает
16
+ * тумблер «Письмо» ровно у видов отсюда: у остальных письма нет, и тумблер
17
+ * рядом врал бы — ровно та ложь, которую снимает PRJ-132.
18
+ *
19
+ * Список снят с кода, а не с памяти: письма шлют две точки, обе спрашивают
20
+ * `isAllowed(prefs, kind, "email")` —
21
+ * - `packages/api/src/calls/callEmail.ts` (KIND_TO_NOTIF): приглашение на
22
+ * созвон с .ics и его перенос / отмена / правка;
23
+ * - `packages/api/src/ai/runtimeHealth.ts`: «AI-ключ воркспейса не работает».
24
+ * Дайджеста на почту всё ещё нет — вот он и не объявлен здесь ни у одного вида.
25
+ *
26
+ * НАУЧИЛ ВИД ПИСЬМАМ — ДОПИШИ ЕГО СЮДА. Тест
27
+ * `packages/api/tests/notifications.emailKinds.test.ts` обходит отправщиков и
28
+ * падает, если вид шлёт письмо, но здесь не объявлен: иначе человек получал бы
29
+ * письма, которые ничем не выключить.
30
+ */
31
+ export declare const EMAIL_CAPABLE_KINDS: readonly string[];
32
+ /** Уходит ли по этому виду настоящее письмо. Настройка человека — поверх. */
33
+ export declare function canEmail(kind: string): boolean;
10
34
  /**
11
35
  * Уровень для вида, который в реестре не объявлен.
12
36
  *
@@ -24,6 +48,22 @@ export declare function deliveryLevelOf(kind: string): DeliveryLevel;
24
48
  export declare function canPush(kind: string): boolean;
25
49
  /** Двигает ли вид значок непрочитанного. */
26
50
  export declare function countsUnread(kind: string): boolean;
51
+ /**
52
+ * Виды заданного уровня, в порядке объявления в реестре.
53
+ *
54
+ * PRJ-132: по ней экран настроек собирает свои группы — «звенит в телефоне»
55
+ * (`push`) и «только значок» (`counter`). Порядок берётся из реестра
56
+ * намеренно: он сгруппирован по смыслу (задачи, чат, звонки, инфра), и
57
+ * алфавит его только сломал бы.
58
+ */
59
+ export declare function kindsWithLevel(level: DeliveryLevel): readonly string[];
60
+ /**
61
+ * Показывается ли вид на экране настроек уведомлений (PRJ-132).
62
+ *
63
+ * Всё, кроме уровня «лента»: у feed-вида пуша нет по устройству, а не по
64
+ * настройке, и строка с тумблером рядом врала бы человеку (TASWM-327).
65
+ */
66
+ export declare function isSettingsVisibleKind(kind: string): boolean;
27
67
  /**
28
68
  * Виды уровня «лента» — для `kind: { notIn: ... }` в запросах счётчика.
29
69
  *
@@ -138,6 +138,38 @@ export const DELIVERY_LEVELS = {
138
138
  "swarm.feed": "feed",
139
139
  "swarm.note": "feed",
140
140
  };
141
+ /**
142
+ * Виды, которые УМЕЮТ письмо (PRJ-132).
143
+ *
144
+ * Второе свойство вида — рядом с уровнем доставки и по той же причине: канал,
145
+ * объявленный не там, где живёт сам вид, разъезжается с кодом отправки, а
146
+ * разъезд здесь означает недостижимую настройку. Экран настроек показывает
147
+ * тумблер «Письмо» ровно у видов отсюда: у остальных письма нет, и тумблер
148
+ * рядом врал бы — ровно та ложь, которую снимает PRJ-132.
149
+ *
150
+ * Список снят с кода, а не с памяти: письма шлют две точки, обе спрашивают
151
+ * `isAllowed(prefs, kind, "email")` —
152
+ * - `packages/api/src/calls/callEmail.ts` (KIND_TO_NOTIF): приглашение на
153
+ * созвон с .ics и его перенос / отмена / правка;
154
+ * - `packages/api/src/ai/runtimeHealth.ts`: «AI-ключ воркспейса не работает».
155
+ * Дайджеста на почту всё ещё нет — вот он и не объявлен здесь ни у одного вида.
156
+ *
157
+ * НАУЧИЛ ВИД ПИСЬМАМ — ДОПИШИ ЕГО СЮДА. Тест
158
+ * `packages/api/tests/notifications.emailKinds.test.ts` обходит отправщиков и
159
+ * падает, если вид шлёт письмо, но здесь не объявлен: иначе человек получал бы
160
+ * письма, которые ничем не выключить.
161
+ */
162
+ export const EMAIL_CAPABLE_KINDS = [
163
+ "event.invite",
164
+ "call.rescheduled",
165
+ "call.cancelled",
166
+ "call.updated",
167
+ "ai.key_broken",
168
+ ];
169
+ /** Уходит ли по этому виду настоящее письмо. Настройка человека — поверх. */
170
+ export function canEmail(kind) {
171
+ return EMAIL_CAPABLE_KINDS.includes(kind);
172
+ }
141
173
  /**
142
174
  * Уровень для вида, который в реестре не объявлен.
143
175
  *
@@ -163,14 +195,33 @@ export function canPush(kind) {
163
195
  export function countsUnread(kind) {
164
196
  return deliveryLevelOf(kind) !== "feed";
165
197
  }
198
+ /**
199
+ * Виды заданного уровня, в порядке объявления в реестре.
200
+ *
201
+ * PRJ-132: по ней экран настроек собирает свои группы — «звенит в телефоне»
202
+ * (`push`) и «только значок» (`counter`). Порядок берётся из реестра
203
+ * намеренно: он сгруппирован по смыслу (задачи, чат, звонки, инфра), и
204
+ * алфавит его только сломал бы.
205
+ */
206
+ export function kindsWithLevel(level) {
207
+ return Object.keys(DELIVERY_LEVELS).filter((k) => DELIVERY_LEVELS[k] === level);
208
+ }
209
+ /**
210
+ * Показывается ли вид на экране настроек уведомлений (PRJ-132).
211
+ *
212
+ * Всё, кроме уровня «лента»: у feed-вида пуша нет по устройству, а не по
213
+ * настройке, и строка с тумблером рядом врала бы человеку (TASWM-327).
214
+ */
215
+ export function isSettingsVisibleKind(kind) {
216
+ return deliveryLevelOf(kind) !== "feed";
217
+ }
166
218
  /**
167
219
  * Виды уровня «лента» — для `kind: { notIn: ... }` в запросах счётчика.
168
220
  *
169
221
  * Миграция не нужна: счётчик считается запросом, и прошлые строки
170
222
  * пересчитываются сами, как только вид попал сюда.
171
223
  */
172
- export const FEED_ONLY_KINDS = Object.keys(DELIVERY_LEVELS)
173
- .filter((k) => DELIVERY_LEVELS[k] === "feed");
224
+ export const FEED_ONLY_KINDS = kindsWithLevel("feed");
174
225
  // Виды тихого надзора роя — их проставляет mcp/tools/swarm.ts, и имя обязано
175
226
  // жить там же, где политика доставки: разъезд означал бы тихо вернувшийся пуш.
176
227
  export const SWARM_FEED_KIND = "swarm.feed";
@@ -1 +1 @@
1
- {"version":3,"file":"notificationDelivery.js","sourceRoot":"","sources":["../src/notificationDelivery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"notificationDelivery.js","sourceRoot":"","sources":["../src/notificationDelivery.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@taskless-app/shared",
3
- "version": "0.1.47",
3
+ "version": "0.1.48",
4
4
  "type": "module",
5
5
  "description": "Shared types, Zod schemas and design tokens for the Taskless API contract — consumed by @taskless/api, @taskless/web and the Taskless mobile app.",
6
6
  "license": "MIT",