@taskless-app/shared 0.1.12 → 0.1.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/transcriptCoverage.d.ts +147 -0
- package/dist/transcriptCoverage.js +122 -0
- package/dist/transcriptCoverage.js.map +1 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC;AACxC,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC;AACxC,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* Почему у участника ноль реплик. Классификацию делает агент — только он
|
|
4
|
+
* знает, была ли подписка и шли ли PCM-кадры; здесь мы её читаем.
|
|
5
|
+
*
|
|
6
|
+
* `not_subscribed` — публиковал аудио, а рекордера на дорожке не было ни разу;
|
|
7
|
+
* `no_audio` — подписка была, но ни одного кадра не доехало;
|
|
8
|
+
* `suppressed` — сегменты распознавались, но их выбрасывал анти-дубль
|
|
9
|
+
* «участник вышел» (собственно баг PRJ3-101).
|
|
10
|
+
*
|
|
11
|
+
* Молчавших и слушателей здесь НЕТ: их ноль объяснён, и сигналом он не
|
|
12
|
+
* является — иначе предупреждение висело бы на каждом созвоне.
|
|
13
|
+
*/
|
|
14
|
+
export declare const TranscriptCoverageGapReason: z.ZodEnum<["not_subscribed", "no_audio", "suppressed"]>;
|
|
15
|
+
export type TranscriptCoverageGapReason = z.infer<typeof TranscriptCoverageGapReason>;
|
|
16
|
+
/**
|
|
17
|
+
* Отчёт агента за одну сессию.
|
|
18
|
+
*
|
|
19
|
+
* Все поля со значением по умолчанию: отчёт пишет отдельный рантайм и его
|
|
20
|
+
* версии живут вразнобой (агент выкатывается образом, api — своим). Отсутствие
|
|
21
|
+
* поля должно давать «нет данных», а не отбрасывать весь отчёт целиком.
|
|
22
|
+
*/
|
|
23
|
+
export declare const TranscriptCoverage: z.ZodObject<{
|
|
24
|
+
/** Версия формата. Читателей будет больше одного — пусть будет с самого начала. */
|
|
25
|
+
v: z.ZodDefault<z.ZodNumber>;
|
|
26
|
+
/** Сколько людей агент видел в комнате, включая заглянувших на минуту. */
|
|
27
|
+
participants: z.ZodDefault<z.ZodNumber>;
|
|
28
|
+
/** Из них публиковали аудио — столько дорожек ДОЛЖНО было слушаться. */
|
|
29
|
+
audioTracks: z.ZodDefault<z.ZodNumber>;
|
|
30
|
+
/** А столько реально слушалось: подписка есть И звук доехал. */
|
|
31
|
+
recognized: z.ZodDefault<z.ZodNumber>;
|
|
32
|
+
/** Сколько человек попали в расшифровку хотя бы одной репликой. */
|
|
33
|
+
spoke: z.ZodDefault<z.ZodNumber>;
|
|
34
|
+
/** Звук шёл, распознавание работало, человек молчал — это не провал. */
|
|
35
|
+
silent: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
36
|
+
identity: z.ZodString;
|
|
37
|
+
name: z.ZodDefault<z.ZodString>;
|
|
38
|
+
}, "strip", z.ZodTypeAny, {
|
|
39
|
+
identity: string;
|
|
40
|
+
name: string;
|
|
41
|
+
}, {
|
|
42
|
+
identity: string;
|
|
43
|
+
name?: string | undefined;
|
|
44
|
+
}>, "many">>;
|
|
45
|
+
/** Аудио не публиковал вовсе — слушатель, ноль реплик ожидаем. */
|
|
46
|
+
listeners: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
47
|
+
identity: z.ZodString;
|
|
48
|
+
name: z.ZodDefault<z.ZodString>;
|
|
49
|
+
}, "strip", z.ZodTypeAny, {
|
|
50
|
+
identity: string;
|
|
51
|
+
name: string;
|
|
52
|
+
}, {
|
|
53
|
+
identity: string;
|
|
54
|
+
name?: string | undefined;
|
|
55
|
+
}>, "many">>;
|
|
56
|
+
/** Те, у кого речь могла потеряться. Список урезан, счётчик — нет. */
|
|
57
|
+
gaps: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
58
|
+
identity: z.ZodString;
|
|
59
|
+
name: z.ZodDefault<z.ZodString>;
|
|
60
|
+
} & {
|
|
61
|
+
reason: z.ZodEnum<["not_subscribed", "no_audio", "suppressed"]>;
|
|
62
|
+
}, "strip", z.ZodTypeAny, {
|
|
63
|
+
identity: string;
|
|
64
|
+
name: string;
|
|
65
|
+
reason: "no_audio" | "not_subscribed" | "suppressed";
|
|
66
|
+
}, {
|
|
67
|
+
identity: string;
|
|
68
|
+
name?: string | undefined;
|
|
69
|
+
reason: "no_audio" | "not_subscribed" | "suppressed";
|
|
70
|
+
}>, "many">>;
|
|
71
|
+
gapCount: z.ZodDefault<z.ZodNumber>;
|
|
72
|
+
/** Сколько дорожек пришлось чинить реконсиляцией подписок. */
|
|
73
|
+
repairedSubscriptions: z.ZodDefault<z.ZodNumber>;
|
|
74
|
+
/** Сколько распознанных сегментов выброшено анти-дублем «вышедшего». */
|
|
75
|
+
suppressedSegments: z.ZodDefault<z.ZodNumber>;
|
|
76
|
+
}, "strip", z.ZodTypeAny, {
|
|
77
|
+
v: number;
|
|
78
|
+
participants: number;
|
|
79
|
+
audioTracks: number;
|
|
80
|
+
recognized: number;
|
|
81
|
+
spoke: number;
|
|
82
|
+
silent: {
|
|
83
|
+
identity: string;
|
|
84
|
+
name: string;
|
|
85
|
+
}[];
|
|
86
|
+
listeners: {
|
|
87
|
+
identity: string;
|
|
88
|
+
name: string;
|
|
89
|
+
}[];
|
|
90
|
+
gaps: {
|
|
91
|
+
identity: string;
|
|
92
|
+
name: string;
|
|
93
|
+
reason: "no_audio" | "not_subscribed" | "suppressed";
|
|
94
|
+
}[];
|
|
95
|
+
gapCount: number;
|
|
96
|
+
repairedSubscriptions: number;
|
|
97
|
+
suppressedSegments: number;
|
|
98
|
+
}, {
|
|
99
|
+
v?: number | undefined;
|
|
100
|
+
participants?: number | undefined;
|
|
101
|
+
audioTracks?: number | undefined;
|
|
102
|
+
recognized?: number | undefined;
|
|
103
|
+
spoke?: number | undefined;
|
|
104
|
+
silent?: {
|
|
105
|
+
identity: string;
|
|
106
|
+
name?: string | undefined;
|
|
107
|
+
}[] | undefined;
|
|
108
|
+
listeners?: {
|
|
109
|
+
identity: string;
|
|
110
|
+
name?: string | undefined;
|
|
111
|
+
}[] | undefined;
|
|
112
|
+
gaps?: {
|
|
113
|
+
identity: string;
|
|
114
|
+
name?: string | undefined;
|
|
115
|
+
reason: "no_audio" | "not_subscribed" | "suppressed";
|
|
116
|
+
}[] | undefined;
|
|
117
|
+
gapCount?: number | undefined;
|
|
118
|
+
repairedSubscriptions?: number | undefined;
|
|
119
|
+
suppressedSegments?: number | undefined;
|
|
120
|
+
}>;
|
|
121
|
+
export type TranscriptCoverage = z.infer<typeof TranscriptCoverage>;
|
|
122
|
+
/**
|
|
123
|
+
* Разобрать значение JSON-колонки. Мусор и `null` дают `null` — «данных нет»,
|
|
124
|
+
* а это не то же самое, что «покрытие полное»: у сессий до PRJ3-101 отчёта нет
|
|
125
|
+
* вовсе, и рисовать по ним зелёный вердикт было бы враньём.
|
|
126
|
+
*/
|
|
127
|
+
export declare function parseTranscriptCoverage(raw: unknown): TranscriptCoverage | null;
|
|
128
|
+
/**
|
|
129
|
+
* Есть ли расхождение, о котором стоит сказать человеку.
|
|
130
|
+
*
|
|
131
|
+
* Считаем по `gapCount`, а не по разнице `participants − recognized`: разница
|
|
132
|
+
* штатно ненулевая на любом созвоне со слушателями, и предупреждение по ней
|
|
133
|
+
* висело бы всегда, то есть не значило бы ничего. Провал — это только
|
|
134
|
+
* необъяснённый ноль.
|
|
135
|
+
*/
|
|
136
|
+
export declare function hasTranscriptCoverageGap(coverage: TranscriptCoverage | null): boolean;
|
|
137
|
+
/**
|
|
138
|
+
* Строка «сколько дорожек из скольких участников» — то, что человек хотел
|
|
139
|
+
* увидеть, не разбирая базу руками.
|
|
140
|
+
*/
|
|
141
|
+
export declare function transcriptCoverageSummary(coverage: TranscriptCoverage): string;
|
|
142
|
+
/** «1 дорожку», «2 дорожки», «5 дорожек» — винительный, как в «распознавали N». */
|
|
143
|
+
export declare function pluralTracks(n: number): string;
|
|
144
|
+
/** «из 1 участника», «из 13 участников» — родительный, как в «из N». */
|
|
145
|
+
export declare function pluralPeople(n: number): string;
|
|
146
|
+
/** Человеческая причина провала — одними словами в UI и в логах. */
|
|
147
|
+
export declare const TRANSCRIPT_COVERAGE_GAP_LABEL: Record<TranscriptCoverageGapReason, string>;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
// PRJ3-101 — покрытие расшифровки: контракт отчёта агента и его чтение.
|
|
2
|
+
//
|
|
3
|
+
// Дейли 10.08: пятеро участников из тринадцати с нулём реплик, трое из них
|
|
4
|
+
// сидели в звонке 30–46 минут. Расшифровка при этом работала — 510 реплик, ни
|
|
5
|
+
// одного провала. Проблема была не в распознавании, а в том, что до него
|
|
6
|
+
// доезжали не все дорожки, и заметить это можно было единственным способом:
|
|
7
|
+
// прочитать итог и удивиться, что человека там нет.
|
|
8
|
+
//
|
|
9
|
+
// Агент теперь считает покрытие по ходу звонка и кладёт отчёт в
|
|
10
|
+
// `CallSession.transcriptCoverage` (см. agent/src/taskless_agent/coverage.py).
|
|
11
|
+
// Здесь — схема этого отчёта и функция, отвечающая на единственный вопрос,
|
|
12
|
+
// ради которого он есть: расходится ли число дорожек с числом участников.
|
|
13
|
+
//
|
|
14
|
+
// Разбор именно схемой, а не «привести as": колонка `Json`, писал её другой
|
|
15
|
+
// рантайм (python), и мусор оттуда не должен ронять итог звонка.
|
|
16
|
+
import { z } from "zod";
|
|
17
|
+
/**
|
|
18
|
+
* Почему у участника ноль реплик. Классификацию делает агент — только он
|
|
19
|
+
* знает, была ли подписка и шли ли PCM-кадры; здесь мы её читаем.
|
|
20
|
+
*
|
|
21
|
+
* `not_subscribed` — публиковал аудио, а рекордера на дорожке не было ни разу;
|
|
22
|
+
* `no_audio` — подписка была, но ни одного кадра не доехало;
|
|
23
|
+
* `suppressed` — сегменты распознавались, но их выбрасывал анти-дубль
|
|
24
|
+
* «участник вышел» (собственно баг PRJ3-101).
|
|
25
|
+
*
|
|
26
|
+
* Молчавших и слушателей здесь НЕТ: их ноль объяснён, и сигналом он не
|
|
27
|
+
* является — иначе предупреждение висело бы на каждом созвоне.
|
|
28
|
+
*/
|
|
29
|
+
export const TranscriptCoverageGapReason = z.enum([
|
|
30
|
+
"not_subscribed",
|
|
31
|
+
"no_audio",
|
|
32
|
+
"suppressed",
|
|
33
|
+
]);
|
|
34
|
+
const Person = z.object({
|
|
35
|
+
identity: z.string(),
|
|
36
|
+
name: z.string().default(""),
|
|
37
|
+
});
|
|
38
|
+
/**
|
|
39
|
+
* Отчёт агента за одну сессию.
|
|
40
|
+
*
|
|
41
|
+
* Все поля со значением по умолчанию: отчёт пишет отдельный рантайм и его
|
|
42
|
+
* версии живут вразнобой (агент выкатывается образом, api — своим). Отсутствие
|
|
43
|
+
* поля должно давать «нет данных», а не отбрасывать весь отчёт целиком.
|
|
44
|
+
*/
|
|
45
|
+
export const TranscriptCoverage = z.object({
|
|
46
|
+
/** Версия формата. Читателей будет больше одного — пусть будет с самого начала. */
|
|
47
|
+
v: z.number().int().default(1),
|
|
48
|
+
/** Сколько людей агент видел в комнате, включая заглянувших на минуту. */
|
|
49
|
+
participants: z.number().int().min(0).default(0),
|
|
50
|
+
/** Из них публиковали аудио — столько дорожек ДОЛЖНО было слушаться. */
|
|
51
|
+
audioTracks: z.number().int().min(0).default(0),
|
|
52
|
+
/** А столько реально слушалось: подписка есть И звук доехал. */
|
|
53
|
+
recognized: z.number().int().min(0).default(0),
|
|
54
|
+
/** Сколько человек попали в расшифровку хотя бы одной репликой. */
|
|
55
|
+
spoke: z.number().int().min(0).default(0),
|
|
56
|
+
/** Звук шёл, распознавание работало, человек молчал — это не провал. */
|
|
57
|
+
silent: z.array(Person).default([]),
|
|
58
|
+
/** Аудио не публиковал вовсе — слушатель, ноль реплик ожидаем. */
|
|
59
|
+
listeners: z.array(Person).default([]),
|
|
60
|
+
/** Те, у кого речь могла потеряться. Список урезан, счётчик — нет. */
|
|
61
|
+
gaps: z.array(Person.extend({ reason: TranscriptCoverageGapReason })).default([]),
|
|
62
|
+
gapCount: z.number().int().min(0).default(0),
|
|
63
|
+
/** Сколько дорожек пришлось чинить реконсиляцией подписок. */
|
|
64
|
+
repairedSubscriptions: z.number().int().min(0).default(0),
|
|
65
|
+
/** Сколько распознанных сегментов выброшено анти-дублем «вышедшего». */
|
|
66
|
+
suppressedSegments: z.number().int().min(0).default(0),
|
|
67
|
+
});
|
|
68
|
+
/**
|
|
69
|
+
* Разобрать значение JSON-колонки. Мусор и `null` дают `null` — «данных нет»,
|
|
70
|
+
* а это не то же самое, что «покрытие полное»: у сессий до PRJ3-101 отчёта нет
|
|
71
|
+
* вовсе, и рисовать по ним зелёный вердикт было бы враньём.
|
|
72
|
+
*/
|
|
73
|
+
export function parseTranscriptCoverage(raw) {
|
|
74
|
+
if (raw === null || raw === undefined)
|
|
75
|
+
return null;
|
|
76
|
+
const parsed = TranscriptCoverage.safeParse(raw);
|
|
77
|
+
return parsed.success ? parsed.data : null;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Есть ли расхождение, о котором стоит сказать человеку.
|
|
81
|
+
*
|
|
82
|
+
* Считаем по `gapCount`, а не по разнице `participants − recognized`: разница
|
|
83
|
+
* штатно ненулевая на любом созвоне со слушателями, и предупреждение по ней
|
|
84
|
+
* висело бы всегда, то есть не значило бы ничего. Провал — это только
|
|
85
|
+
* необъяснённый ноль.
|
|
86
|
+
*/
|
|
87
|
+
export function hasTranscriptCoverageGap(coverage) {
|
|
88
|
+
return !!coverage && coverage.gapCount > 0;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Строка «сколько дорожек из скольких участников» — то, что человек хотел
|
|
92
|
+
* увидеть, не разбирая базу руками.
|
|
93
|
+
*/
|
|
94
|
+
export function transcriptCoverageSummary(coverage) {
|
|
95
|
+
return `Распознавали ${coverage.recognized} ${pluralTracks(coverage.recognized)} из ${coverage.participants} ${pluralPeople(coverage.participants)}`;
|
|
96
|
+
}
|
|
97
|
+
function plural(n, one, few, many) {
|
|
98
|
+
const mod100 = n % 100;
|
|
99
|
+
if (mod100 >= 11 && mod100 <= 14)
|
|
100
|
+
return many;
|
|
101
|
+
const mod10 = n % 10;
|
|
102
|
+
if (mod10 === 1)
|
|
103
|
+
return one;
|
|
104
|
+
if (mod10 >= 2 && mod10 <= 4)
|
|
105
|
+
return few;
|
|
106
|
+
return many;
|
|
107
|
+
}
|
|
108
|
+
/** «1 дорожку», «2 дорожки», «5 дорожек» — винительный, как в «распознавали N». */
|
|
109
|
+
export function pluralTracks(n) {
|
|
110
|
+
return plural(n, "дорожку", "дорожки", "дорожек");
|
|
111
|
+
}
|
|
112
|
+
/** «из 1 участника», «из 13 участников» — родительный, как в «из N». */
|
|
113
|
+
export function pluralPeople(n) {
|
|
114
|
+
return plural(n, "участника", "участников", "участников");
|
|
115
|
+
}
|
|
116
|
+
/** Человеческая причина провала — одними словами в UI и в логах. */
|
|
117
|
+
export const TRANSCRIPT_COVERAGE_GAP_LABEL = {
|
|
118
|
+
not_subscribed: "дорожку не слушали",
|
|
119
|
+
no_audio: "звук не доехал",
|
|
120
|
+
suppressed: "речь распозналась, но не записалась",
|
|
121
|
+
};
|
|
122
|
+
//# sourceMappingURL=transcriptCoverage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcriptCoverage.js","sourceRoot":"","sources":["../src/transcriptCoverage.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.
|
|
3
|
+
"version": "0.1.13",
|
|
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",
|