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