@tellescope/utilities 1.254.0 → 1.254.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.
@@ -0,0 +1,340 @@
1
+ // Shared, transport-agnostic AI summary code.
2
+ //
3
+ // This module holds the *pure* parts of the Form "AI profile summary" feature so they can be
4
+ // reused by both the webapp SDK loader (data_sources.ts) and the backend DB loader
5
+ // (api/modules/ai_summary_context.ts). It must stay free of any SDK/DB/React imports — only
6
+ // plain record shapes, the types-models Enduser, and constants.
7
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
8
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
9
+ return new (P || (P = Promise))(function (resolve, reject) {
10
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
11
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
12
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
13
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
14
+ });
15
+ };
16
+ var __generator = (this && this.__generator) || function (thisArg, body) {
17
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
18
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
19
+ function verb(n) { return function (v) { return step([n, v]); }; }
20
+ function step(op) {
21
+ if (f) throw new TypeError("Generator is already executing.");
22
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
23
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
24
+ if (y = 0, t) op = [op[0] & 2, t.value];
25
+ switch (op[0]) {
26
+ case 0: case 1: t = op; break;
27
+ case 4: _.label++; return { value: op[1], done: false };
28
+ case 5: _.label++; y = op[1]; op = [0]; continue;
29
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
30
+ default:
31
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
32
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
33
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
34
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
35
+ if (t[2]) _.ops.pop();
36
+ _.trys.pop(); continue;
37
+ }
38
+ op = body.call(thisArg, _);
39
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
40
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
41
+ }
42
+ };
43
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
44
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
45
+ if (ar || !(i in from)) {
46
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
47
+ ar[i] = from[i];
48
+ }
49
+ }
50
+ return to.concat(ar || Array.prototype.slice.call(from));
51
+ };
52
+ import { DEFAULT_AI_SUMMARY_DATA_SOURCE_LIMIT, MAX_AI_SUMMARY_INPUT_TOKENS, } from "@tellescope/constants";
53
+ /* ---------------------------------- formatters ---------------------------------- */
54
+ export var stripHtml = function (s) { return s
55
+ .replace(/<style[^>]*>[\s\S]*?<\/style>/gi, '')
56
+ .replace(/<script[^>]*>[\s\S]*?<\/script>/gi, '')
57
+ .replace(/<[^>]+>/g, ' ')
58
+ .replace(/&nbsp;/gi, ' ')
59
+ .replace(/\s+/g, ' ')
60
+ .trim(); };
61
+ export var fmt = function (d) {
62
+ if (!d)
63
+ return '';
64
+ try {
65
+ return new Date(d).toISOString().slice(0, 16).replace('T', ' ');
66
+ }
67
+ catch (_a) {
68
+ return '';
69
+ }
70
+ };
71
+ export var fmtFromMS = function (ms) {
72
+ if (typeof ms !== 'number')
73
+ return '';
74
+ try {
75
+ return new Date(ms).toISOString().slice(0, 16).replace('T', ' ');
76
+ }
77
+ catch (_a) {
78
+ return '';
79
+ }
80
+ };
81
+ export var fmtResponses = function (responses) {
82
+ if (!Array.isArray(responses))
83
+ return '';
84
+ return responses
85
+ .map(function (r) {
86
+ var ans = r === null || r === void 0 ? void 0 : r.answer;
87
+ var v = ans === null || ans === void 0 ? void 0 : ans.value;
88
+ if (v === undefined || v === null)
89
+ return '';
90
+ if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean') {
91
+ return "".concat(r.fieldTitle || '', ": ").concat(v);
92
+ }
93
+ if (Array.isArray(v))
94
+ return "".concat(r.fieldTitle || '', ": ").concat(v.map(function (x) { var _a; return (_a = x === null || x === void 0 ? void 0 : x.label) !== null && _a !== void 0 ? _a : x; }).join(', '));
95
+ return '';
96
+ })
97
+ .filter(Boolean)
98
+ .join(' | ');
99
+ };
100
+ export var fmtObservation = function (o) {
101
+ var _a, _b, _c, _d;
102
+ var m = o.measurement;
103
+ // numeric value + unit when present; fall back to qualitative result ("positive", etc.)
104
+ var reading = m && typeof m.value === 'number'
105
+ ? "".concat(m.value).concat(m.unit ? " ".concat(m.unit) : '')
106
+ : ((_a = o.qualitativeResult) !== null && _a !== void 0 ? _a : '');
107
+ var name = o.type || o.code || o.category || ''; // what was measured
108
+ var extras = [
109
+ o.refRange ? "ref ".concat(o.refRange) : '',
110
+ (_b = o.statusIndicator) !== null && _b !== void 0 ? _b : '',
111
+ ].filter(Boolean).join(', ');
112
+ var label = name ? "".concat(name, ": ") : '';
113
+ var tail = extras ? " (".concat(extras, ")") : '';
114
+ return "[Observation ".concat(fmt((_d = (_c = o.timestamp) !== null && _c !== void 0 ? _c : o.recordedAt) !== null && _d !== void 0 ? _d : o.createdAt), "] ").concat(label).concat(reading).concat(tail).trim();
115
+ };
116
+ /* ---------------------------------- data source metadata ---------------------------------- */
117
+ export var DATA_SOURCE_LABELS = {
118
+ enduser_observations: 'Observations',
119
+ form_responses: 'Form Responses',
120
+ chats: 'Chat Messages',
121
+ phone_calls: 'Phone Calls',
122
+ calendar_events: 'Calendar Events',
123
+ tickets: 'Tickets',
124
+ sms_messages: 'SMS Messages',
125
+ emails: 'Emails',
126
+ enduser_orders: 'Orders',
127
+ enduser_medications: 'Medications',
128
+ purchases: 'Purchases',
129
+ };
130
+ export var DATA_SOURCE_MAP = {
131
+ enduser_observations: {
132
+ collection: 'enduser_observations',
133
+ sortField: 'timestamp',
134
+ format: fmtObservation,
135
+ },
136
+ form_responses: {
137
+ collection: 'form_responses',
138
+ sortField: 'submittedAt',
139
+ format: function (fr) { var _a, _b; return "[Form \"".concat((_a = fr.formTitle) !== null && _a !== void 0 ? _a : '', "\" ").concat(fmt((_b = fr.submittedAt) !== null && _b !== void 0 ? _b : fr.createdAt), "] ").concat(fmtResponses(fr.responses)); },
140
+ },
141
+ chats: {
142
+ collection: 'chats',
143
+ sortField: 'timestamp',
144
+ // enduserId is set only on enduser-authored chats (schema initializer); senderId is always set
145
+ // (userId for staff, enduserId for patients) so it can't distinguish the sender.
146
+ format: function (m) { var _a, _b; return "[Chat ".concat(fmt((_a = m.timestamp) !== null && _a !== void 0 ? _a : m.createdAt), " ").concat(m.enduserId ? 'patient' : 'staff', "] ").concat((_b = m.message) !== null && _b !== void 0 ? _b : ''); },
147
+ },
148
+ phone_calls: {
149
+ collection: 'phone_calls',
150
+ sortField: 'createdAt',
151
+ format: function (c) { var _a, _b, _c, _d; return "[Call ".concat(fmt(c.createdAt), " ").concat((_a = c.direction) !== null && _a !== void 0 ? _a : '', " ").concat((_b = c.durationInSeconds) !== null && _b !== void 0 ? _b : 0, "s] ").concat((_d = (_c = c.aiSummary) !== null && _c !== void 0 ? _c : c.summary) !== null && _d !== void 0 ? _d : ''); },
152
+ },
153
+ calendar_events: {
154
+ collection: 'calendar_events',
155
+ sortField: 'startTimeInMS',
156
+ format: function (e) { var _a, _b; return "[Appt ".concat(fmtFromMS(e.startTimeInMS), "] ").concat((_a = e.title) !== null && _a !== void 0 ? _a : '', " (").concat((_b = e.type) !== null && _b !== void 0 ? _b : '', ")"); },
157
+ enduserMatchClause: function (enduserId) { return ({ 'attendees.id': enduserId }); },
158
+ },
159
+ tickets: {
160
+ collection: 'tickets',
161
+ sortField: 'createdAt',
162
+ format: function (t) { var _a; return "[Ticket ".concat(fmt(t.createdAt), " ").concat(t.closedAt ? 'closed' : 'open', "] ").concat((_a = t.title) !== null && _a !== void 0 ? _a : ''); },
163
+ },
164
+ sms_messages: {
165
+ collection: 'sms_messages',
166
+ sortField: 'timestamp',
167
+ format: function (s) { var _a, _b; return "[SMS ".concat(fmt((_a = s.timestamp) !== null && _a !== void 0 ? _a : s.createdAt), " ").concat(s.inbound ? 'in' : 'out', "] ").concat((_b = s.message) !== null && _b !== void 0 ? _b : ''); },
168
+ },
169
+ emails: {
170
+ collection: 'emails',
171
+ sortField: 'timestamp',
172
+ format: function (e) {
173
+ var _a, _b;
174
+ var body = e.textContent || stripHtml(e.HTMLContent || '');
175
+ return "[Email ".concat(fmt((_a = e.timestamp) !== null && _a !== void 0 ? _a : e.createdAt), "] ").concat((_b = e.subject) !== null && _b !== void 0 ? _b : '', "\n").concat(body.slice(0, 2000));
176
+ },
177
+ },
178
+ enduser_orders: {
179
+ collection: 'enduser_orders',
180
+ sortField: 'createdAt',
181
+ format: function (o) { var _a, _b; return "[Order ".concat(fmt(o.createdAt), "] ").concat((_a = o.status) !== null && _a !== void 0 ? _a : '', " \u2014 ").concat(((_b = o.items) !== null && _b !== void 0 ? _b : []).map(function (i) { var _a, _b; return (_b = (_a = i.title) !== null && _a !== void 0 ? _a : i.sku) !== null && _b !== void 0 ? _b : ''; }).filter(Boolean).join(', ')); },
182
+ },
183
+ enduser_medications: {
184
+ collection: 'enduser_medications',
185
+ sortField: 'createdAt',
186
+ format: function (m) { var _a, _b, _c; return "[Medication ".concat(fmt(m.createdAt), "] ").concat((_a = m.title) !== null && _a !== void 0 ? _a : '', " ").concat((_b = m.dosage) !== null && _b !== void 0 ? _b : '', " ").concat((_c = m.status) !== null && _c !== void 0 ? _c : '').trim(); },
187
+ },
188
+ purchases: {
189
+ collection: 'purchases',
190
+ sortField: 'createdAt',
191
+ format: function (p) { var _a; return "[Purchase ".concat(fmt(p.createdAt), "] ").concat((_a = p.title) !== null && _a !== void 0 ? _a : '', " ").concat(typeof p.amount === 'number' ? "$".concat(p.amount) : '').trim(); },
192
+ },
193
+ };
194
+ export var enduserProfileToText = function (e) {
195
+ var _a, _b, _c;
196
+ var lines = [];
197
+ lines.push('## enduser');
198
+ if (e.fname || e.lname)
199
+ lines.push("Name: ".concat((_a = e.fname) !== null && _a !== void 0 ? _a : '', " ").concat((_b = e.lname) !== null && _b !== void 0 ? _b : '').trim());
200
+ if (e.dateOfBirth)
201
+ lines.push("DOB: ".concat(e.dateOfBirth));
202
+ if (e.gender)
203
+ lines.push("Gender: ".concat(e.gender));
204
+ if (e.state)
205
+ lines.push("State: ".concat(e.state));
206
+ if (e.email)
207
+ lines.push("Email: ".concat(e.email));
208
+ if (e.phone)
209
+ lines.push("Phone: ".concat(e.phone));
210
+ if ((_c = e.tags) === null || _c === void 0 ? void 0 : _c.length)
211
+ lines.push("Tags: ".concat(e.tags.join(', ')));
212
+ if (e.fields && typeof e.fields === 'object') {
213
+ var entries = Object.entries(e.fields).filter(function (_a) {
214
+ var _ = _a[0], v = _a[1];
215
+ return v !== '' && v !== null && v !== undefined;
216
+ });
217
+ if (entries.length) {
218
+ lines.push('Custom fields:');
219
+ for (var _i = 0, entries_1 = entries; _i < entries_1.length; _i++) {
220
+ var _d = entries_1[_i], k = _d[0], v = _d[1];
221
+ lines.push(" - ".concat(k, ": ").concat(typeof v === 'object' ? JSON.stringify(v) : String(v)));
222
+ }
223
+ }
224
+ }
225
+ return lines.join('\n');
226
+ };
227
+ /* ---------------------------------- filter sanitization ---------------------------------- */
228
+ export var FORBIDDEN_FILTER_OPERATORS = ['$where', '$function'];
229
+ export var aiSummaryError = function (code, message) { return Object.assign(new Error(message), { code: code }); };
230
+ export var sanitizeFilter = function (filter) {
231
+ if (!filter || typeof filter !== 'object')
232
+ return {};
233
+ var json = JSON.stringify(filter);
234
+ for (var _i = 0, FORBIDDEN_FILTER_OPERATORS_1 = FORBIDDEN_FILTER_OPERATORS; _i < FORBIDDEN_FILTER_OPERATORS_1.length; _i++) {
235
+ var op = FORBIDDEN_FILTER_OPERATORS_1[_i];
236
+ if (json.includes(op)) {
237
+ throw aiSummaryError(400, "AI summary filter cannot contain ".concat(op));
238
+ }
239
+ }
240
+ return filter;
241
+ };
242
+ // Build the mongo filter + effective limit for a single data source. Shared by both loaders so
243
+ // the lookback / enduserMatch / sanitized-filter / default-limit logic stays identical.
244
+ export var buildAISummarySourceFilter = function (_a) {
245
+ var _b;
246
+ var _c;
247
+ var ds = _a.ds, enduserId = _a.enduserId, mapEntry = _a.mapEntry;
248
+ var userFilter = sanitizeFilter(ds.filter);
249
+ var lookbackClause = ds.lookbackMS
250
+ ? (_b = {}, _b[mapEntry.sortField] = { $gte: new Date(Date.now() - ds.lookbackMS) }, _b) : {};
251
+ var enduserMatch = mapEntry.enduserMatchClause ? mapEntry.enduserMatchClause(enduserId) : { enduserId: enduserId };
252
+ var mdbFilter = { $and: [userFilter, lookbackClause, enduserMatch] };
253
+ var effectiveLimit = (_c = ds.limit) !== null && _c !== void 0 ? _c : DEFAULT_AI_SUMMARY_DATA_SOURCE_LIMIT;
254
+ return { mdbFilter: mdbFilter, effectiveLimit: effectiveLimit };
255
+ };
256
+ // Join the profile block + per-source blocks, estimate tokens, and enforce the input budget.
257
+ export var assembleAISummaryContext = function (_a) {
258
+ var profileBlock = _a.profileBlock, sources = _a.sources;
259
+ var blocks = sources
260
+ .filter(function (s) { return s.formattedLines.length > 0; })
261
+ .map(function (s) { return "## ".concat(s.type, "\n").concat(s.formattedLines.join('\n')); });
262
+ var contextText = __spreadArray([profileBlock], blocks, true).filter(Boolean).join('\n\n');
263
+ var estimatedTokens = Math.ceil(contextText.length / 4);
264
+ if (estimatedTokens > MAX_AI_SUMMARY_INPUT_TOKENS) {
265
+ throw aiSummaryError(413, 'AI summary input exceeds token budget — reduce limits, shorten lookback, or remove data sources.');
266
+ }
267
+ return { contextText: contextText, estimatedTokens: estimatedTokens, profileBlock: profileBlock, sources: sources };
268
+ };
269
+ // Transport-agnostic loader. Callers inject loadProfile/loadRecords backed by the SDK (webapp) or
270
+ // the DB (api). Per-source failures degrade to an empty section so one broken collection doesn't
271
+ // sink the whole summary; filter-sanitization (400) and the token-budget (413) errors still throw.
272
+ export var loadAISummaryContext = function (_a) {
273
+ var enduserId = _a.enduserId, configuration = _a.configuration, loadProfile = _a.loadProfile, loadRecords = _a.loadRecords, _b = _a.includeProfile, includeProfile = _b === void 0 ? true : _b;
274
+ return __awaiter(void 0, void 0, void 0, function () {
275
+ var enduser, _c, profileBlock, sections, sources;
276
+ var _d;
277
+ return __generator(this, function (_e) {
278
+ switch (_e.label) {
279
+ case 0:
280
+ if (!includeProfile) return [3 /*break*/, 2];
281
+ return [4 /*yield*/, loadProfile(enduserId)];
282
+ case 1:
283
+ _c = _e.sent();
284
+ return [3 /*break*/, 3];
285
+ case 2:
286
+ _c = null;
287
+ _e.label = 3;
288
+ case 3:
289
+ enduser = _c;
290
+ profileBlock = enduser ? enduserProfileToText(enduser) : '';
291
+ return [4 /*yield*/, Promise.all(((_d = configuration.dataSources) !== null && _d !== void 0 ? _d : []).map(function (ds) { return __awaiter(void 0, void 0, void 0, function () {
292
+ var m, _a, mdbFilter, effectiveLimit, records, list, formattedLines, err_1;
293
+ var _b, _c;
294
+ return __generator(this, function (_d) {
295
+ switch (_d.label) {
296
+ case 0:
297
+ m = DATA_SOURCE_MAP[ds.type];
298
+ if (!m)
299
+ return [2 /*return*/, null];
300
+ _a = buildAISummarySourceFilter({ ds: ds, enduserId: enduserId, mapEntry: m }), mdbFilter = _a.mdbFilter, effectiveLimit = _a.effectiveLimit;
301
+ _d.label = 1;
302
+ case 1:
303
+ _d.trys.push([1, 3, , 4]);
304
+ return [4 /*yield*/, loadRecords({ type: ds.type, collection: m.collection, mdbFilter: mdbFilter, limit: effectiveLimit, sortField: m.sortField })];
305
+ case 2:
306
+ records = _d.sent();
307
+ list = Array.isArray(records) ? records : [];
308
+ formattedLines = list.map(m.format).filter(Boolean);
309
+ return [2 /*return*/, {
310
+ type: ds.type,
311
+ label: (_b = DATA_SOURCE_LABELS[ds.type]) !== null && _b !== void 0 ? _b : ds.type,
312
+ lookbackMS: ds.lookbackMS,
313
+ limit: effectiveLimit,
314
+ records: list,
315
+ formattedLines: formattedLines,
316
+ }];
317
+ case 3:
318
+ err_1 = _d.sent();
319
+ console.error("Failed to load ".concat(ds.type, " for AI summary"), err_1);
320
+ return [2 /*return*/, {
321
+ type: ds.type,
322
+ label: (_c = DATA_SOURCE_LABELS[ds.type]) !== null && _c !== void 0 ? _c : ds.type,
323
+ lookbackMS: ds.lookbackMS,
324
+ limit: effectiveLimit,
325
+ records: [],
326
+ formattedLines: [],
327
+ }];
328
+ case 4: return [2 /*return*/];
329
+ }
330
+ });
331
+ }); }))];
332
+ case 4:
333
+ sections = _e.sent();
334
+ sources = sections.filter(function (s) { return s !== null; });
335
+ return [2 /*return*/, assembleAISummaryContext({ profileBlock: profileBlock, sources: sources })];
336
+ }
337
+ });
338
+ });
339
+ };
340
+ //# sourceMappingURL=ai_summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai_summary.js","sourceRoot":"","sources":["../../src/ai_summary.ts"],"names":[],"mappings":"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"}