@dsh-enhanced/assistant-evaluation 0.1.65 → 0.1.67

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.
Files changed (89) hide show
  1. package/README.md +69 -1
  2. package/lib/attention-owner-questions.d.ts +104 -0
  3. package/lib/attention-owner-questions.d.ts.map +1 -0
  4. package/lib/attention-owner-questions.js +179 -0
  5. package/lib/attention-owner-questions.js.map +1 -0
  6. package/lib/attention-tuning.d.ts +492 -0
  7. package/lib/attention-tuning.d.ts.map +1 -0
  8. package/lib/attention-tuning.js +1044 -0
  9. package/lib/attention-tuning.js.map +1 -0
  10. package/lib/benchmark/cli.d.ts.map +1 -1
  11. package/lib/benchmark/cli.js +14 -11
  12. package/lib/benchmark/cli.js.map +1 -1
  13. package/lib/benchmark/corpus.d.ts +13 -2
  14. package/lib/benchmark/corpus.d.ts.map +1 -1
  15. package/lib/benchmark/corpus.js +19 -9
  16. package/lib/benchmark/corpus.js.map +1 -1
  17. package/lib/benchmark/families-corpus.d.ts +11 -0
  18. package/lib/benchmark/families-corpus.d.ts.map +1 -0
  19. package/lib/benchmark/families-corpus.js +133 -0
  20. package/lib/benchmark/families-corpus.js.map +1 -0
  21. package/lib/benchmark/holdout-isolation.d.ts +27 -0
  22. package/lib/benchmark/holdout-isolation.d.ts.map +1 -0
  23. package/lib/benchmark/holdout-isolation.js +66 -0
  24. package/lib/benchmark/holdout-isolation.js.map +1 -0
  25. package/lib/benchmark/holdout.d.ts.map +1 -1
  26. package/lib/benchmark/holdout.js +3 -0
  27. package/lib/benchmark/holdout.js.map +1 -1
  28. package/lib/benchmark/index.d.ts +3 -0
  29. package/lib/benchmark/index.d.ts.map +1 -1
  30. package/lib/benchmark/index.js +2 -0
  31. package/lib/benchmark/index.js.map +1 -1
  32. package/lib/benchmark/native-skills.d.ts +12 -14
  33. package/lib/benchmark/native-skills.d.ts.map +1 -1
  34. package/lib/benchmark/native-skills.js +1 -3
  35. package/lib/benchmark/native-skills.js.map +1 -1
  36. package/lib/benchmark/native.d.ts +15 -2
  37. package/lib/benchmark/native.d.ts.map +1 -1
  38. package/lib/benchmark/native.js +67 -14
  39. package/lib/benchmark/native.js.map +1 -1
  40. package/lib/benchmark/report.d.ts.map +1 -1
  41. package/lib/benchmark/report.js +98 -8
  42. package/lib/benchmark/report.js.map +1 -1
  43. package/lib/benchmark/runner.d.ts.map +1 -1
  44. package/lib/benchmark/runner.js +5 -0
  45. package/lib/benchmark/runner.js.map +1 -1
  46. package/lib/benchmark/strategy-capabilities.d.ts.map +1 -1
  47. package/lib/benchmark/strategy-capabilities.js +0 -5
  48. package/lib/benchmark/strategy-capabilities.js.map +1 -1
  49. package/lib/benchmark/types.d.ts +64 -7
  50. package/lib/benchmark/types.d.ts.map +1 -1
  51. package/lib/index.d.ts +8 -1
  52. package/lib/index.d.ts.map +1 -1
  53. package/lib/index.js +4 -0
  54. package/lib/index.js.map +1 -1
  55. package/lib/intake-attention-agreement.d.ts +63 -0
  56. package/lib/intake-attention-agreement.d.ts.map +1 -0
  57. package/lib/intake-attention-agreement.js +146 -0
  58. package/lib/intake-attention-agreement.js.map +1 -0
  59. package/lib/notification-outcomes.d.ts +56 -0
  60. package/lib/notification-outcomes.d.ts.map +1 -0
  61. package/lib/notification-outcomes.js +348 -0
  62. package/lib/notification-outcomes.js.map +1 -0
  63. package/lib/service.d.ts +295 -2
  64. package/lib/service.d.ts.map +1 -1
  65. package/lib/service.js +965 -5
  66. package/lib/service.js.map +1 -1
  67. package/lib/sqlite.d.ts +8 -2
  68. package/lib/sqlite.d.ts.map +1 -1
  69. package/lib/sqlite.js +406 -17
  70. package/lib/sqlite.js.map +1 -1
  71. package/lib/store.d.ts +13 -2
  72. package/lib/store.d.ts.map +1 -1
  73. package/lib/store.js +122 -24
  74. package/lib/store.js.map +1 -1
  75. package/lib/types.d.ts +247 -5
  76. package/lib/types.d.ts.map +1 -1
  77. package/lib/types.js +11 -0
  78. package/lib/types.js.map +1 -1
  79. package/lib/version.d.ts +1 -1
  80. package/lib/version.js +1 -1
  81. package/lib/work-item-owner-proof.d.ts +4 -0
  82. package/lib/work-item-owner-proof.d.ts.map +1 -0
  83. package/lib/work-item-owner-proof.js +53 -0
  84. package/lib/work-item-owner-proof.js.map +1 -0
  85. package/package.json +29 -38
  86. package/lib/benchmark/super-relay.d.ts +0 -26
  87. package/lib/benchmark/super-relay.d.ts.map +0 -1
  88. package/lib/benchmark/super-relay.js +0 -173
  89. package/lib/benchmark/super-relay.js.map +0 -1
@@ -0,0 +1,348 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { canonicalEvaluationScope, EvaluationStoreError } from './store.js';
3
+ import { NOTIFICATION_OUTCOME_RECORD_PROTOCOL, notificationOutcomes, objectiveStatuses, } from './types.js';
4
+ const purposes = ['result', 'attention', 'answer'];
5
+ const purposeSources = ['declared', 'lane', 'default'];
6
+ const verdicts = ['would-accept', 'would-attach', 'would-reject'];
7
+ const transportStatuses = ['pending', 'attempting', 'accepted', 'delivered', 'read', 'retry_wait', 'dead', 'unknown_after_send'];
8
+ const judgementSources = ['owner-objective', 'work-item-feedback'];
9
+ function invalid(message) {
10
+ throw new EvaluationStoreError('invalid-input', `notification outcome fact: ${message}`);
11
+ }
12
+ function plain(value, label) {
13
+ if (value === null || typeof value !== 'object' || Array.isArray(value))
14
+ invalid(`${label} must be an object`);
15
+ return value;
16
+ }
17
+ function text(value, label, max = 256) {
18
+ if (typeof value !== 'string' || value.length < 1 || value.length > max || value.trim() !== value || /\p{Cc}/u.test(value)) {
19
+ invalid(`${label} must be a bounded identifier`);
20
+ }
21
+ return value;
22
+ }
23
+ function optionalText(value, label) {
24
+ return value === undefined ? undefined : text(value, label);
25
+ }
26
+ function time(value, label) {
27
+ if (!Number.isSafeInteger(value) || value < 0)
28
+ invalid(`${label} must be a non-negative safe integer`);
29
+ return value;
30
+ }
31
+ function optionalTime(value, label) {
32
+ return value === undefined ? undefined : time(value, label);
33
+ }
34
+ function member(value, allowed, label) {
35
+ if (typeof value !== 'string' || !allowed.includes(value))
36
+ invalid(`${label} is not recognised`);
37
+ return value;
38
+ }
39
+ /** Strict shape check: Delivery facts are trusted Host data, but never trusted to be well-formed. */
40
+ export function normalizeNotificationOutcomeFact(input) {
41
+ const fact = plain(input, 'fact');
42
+ const transport = plain(fact.transport, 'transport');
43
+ const reasons = fact.reasons;
44
+ if (!Array.isArray(reasons) || reasons.length > 32)
45
+ invalid('reasons must be a bounded array');
46
+ const scope = plain(fact.scope, 'scope');
47
+ const reaction = fact.reaction === undefined ? undefined : plain(fact.reaction, 'reaction');
48
+ const judgement = fact.judgement === undefined ? undefined : plain(fact.judgement, 'judgement');
49
+ if (judgement !== undefined && (!Number.isSafeInteger(judgement.version) || judgement.version < 1)) {
50
+ invalid('judgement.version must be a positive integer');
51
+ }
52
+ const route = fact.route === undefined ? undefined : plain(fact.route, 'route');
53
+ if (route !== undefined && (Object.keys(route).length !== 2 || route.kind !== 'linked'))
54
+ invalid('route must be a linked route');
55
+ const originBindingId = route === undefined ? undefined : text(route.originBindingId, 'route.originBindingId');
56
+ if (originBindingId !== undefined && originBindingId === fact.bindingId)
57
+ invalid('route.originBindingId must differ from bindingId');
58
+ const workItemId = optionalText(fact.workItemId, 'workItemId');
59
+ const questionId = optionalText(fact.questionId, 'questionId');
60
+ const answersQuestionId = optionalText(fact.answersQuestionId, 'answersQuestionId');
61
+ const acceptedAt = optionalTime(transport.acceptedAt, 'transport.acceptedAt');
62
+ const deliveredAt = optionalTime(transport.deliveredAt, 'transport.deliveredAt');
63
+ const readAt = optionalTime(transport.readAt, 'transport.readAt');
64
+ return {
65
+ auditSequence: time(fact.auditSequence, 'auditSequence'),
66
+ outboxId: text(fact.outboxId, 'outboxId'),
67
+ bindingId: text(fact.bindingId, 'bindingId'),
68
+ scope: canonicalEvaluationScope({ workspace: scope.workspace, preset: scope.preset }).scope,
69
+ lane: text(fact.lane, 'lane', 64),
70
+ sourceId: text(fact.sourceId, 'sourceId'),
71
+ purpose: member(fact.purpose, purposes, 'purpose'),
72
+ purposeSource: member(fact.purposeSource, purposeSources, 'purposeSource'),
73
+ ...(workItemId === undefined ? {} : { workItemId }),
74
+ ...(questionId === undefined ? {} : { questionId }),
75
+ ...(answersQuestionId === undefined ? {} : { answersQuestionId }),
76
+ verdict: member(fact.verdict, verdicts, 'verdict'),
77
+ reasons: reasons.map((reason, index) => text(reason, `reasons[${index}]`, 64)),
78
+ auditedAt: time(fact.auditedAt, 'auditedAt'),
79
+ transport: {
80
+ status: member(transport.status, transportStatuses, 'transport.status'),
81
+ ...(acceptedAt === undefined ? {} : { acceptedAt }),
82
+ ...(deliveredAt === undefined ? {} : { deliveredAt }),
83
+ ...(readAt === undefined ? {} : { readAt }),
84
+ },
85
+ ...(reaction === undefined ? {} : { reaction: { firstAt: time(reaction.firstAt, 'reaction.firstAt') } }),
86
+ ...(judgement === undefined ? {} : { judgement: {
87
+ source: member(judgement.source, judgementSources, 'judgement.source'),
88
+ version: judgement.version,
89
+ objectiveStatus: member(judgement.objectiveStatus, objectiveStatuses, 'judgement.objectiveStatus'),
90
+ } }),
91
+ ...(originBindingId === undefined ? {} : { route: { kind: 'linked', originBindingId } }),
92
+ };
93
+ }
94
+ /**
95
+ * Deterministic `notification-outcome/v1` classifier. Precedence: an owner
96
+ * judgement (rejected, accepted) beats a reply (reacted), which beats transport
97
+ * state. A withdrawn judgement (`unknown`) contributes nothing. Expiry depends
98
+ * only on `now`, the earliest sent timestamp and the configured window. An
99
+ * optional linked route is carried verbatim and never affects the outcome, so
100
+ * the classifier stays at version 1 and route-free records keep their digests.
101
+ */
102
+ export function classifyNotificationOutcome(fact, now, responseWindowMs) {
103
+ const judgement = fact.judgement !== undefined && fact.judgement.objectiveStatus !== 'unknown'
104
+ ? { source: fact.judgement.source, version: fact.judgement.version, objectiveStatus: fact.judgement.objectiveStatus }
105
+ : undefined;
106
+ const sentTimes = [fact.transport.acceptedAt, fact.transport.deliveredAt, fact.transport.readAt].filter(value => value !== undefined);
107
+ const sentAt = sentTimes.length === 0 ? undefined : Math.min(...sentTimes);
108
+ let outcome;
109
+ let expiry;
110
+ if (judgement?.objectiveStatus === 'not-achieved')
111
+ outcome = 'rejected';
112
+ else if (judgement?.objectiveStatus === 'achieved')
113
+ outcome = 'accepted';
114
+ else if (fact.reaction !== undefined || judgement?.objectiveStatus === 'partial')
115
+ outcome = 'reacted';
116
+ else if (fact.transport.status === 'dead')
117
+ outcome = 'failed';
118
+ else if (sentAt !== undefined) {
119
+ if (now >= sentAt + responseWindowMs) {
120
+ outcome = 'expired-unhandled';
121
+ expiry = { at: sentAt + responseWindowMs, responseWindowMs };
122
+ }
123
+ else
124
+ outcome = 'delivered';
125
+ }
126
+ else
127
+ outcome = 'pending';
128
+ return {
129
+ protocol: NOTIFICATION_OUTCOME_RECORD_PROTOCOL,
130
+ classifier: { id: 'notification-outcome', version: 1 },
131
+ notificationId: fact.outboxId,
132
+ scope: { workspace: fact.scope.workspace, preset: fact.scope.preset },
133
+ bindingId: fact.bindingId,
134
+ lane: fact.lane,
135
+ sourceId: fact.sourceId,
136
+ purpose: fact.purpose,
137
+ purposeSource: fact.purposeSource,
138
+ ...(fact.workItemId === undefined ? {} : { workItemId: fact.workItemId }),
139
+ ...(fact.questionId === undefined ? {} : { questionId: fact.questionId }),
140
+ ...(fact.answersQuestionId === undefined ? {} : { answersQuestionId: fact.answersQuestionId }),
141
+ verdict: fact.verdict,
142
+ reasons: [...fact.reasons],
143
+ notifiedAt: fact.auditedAt,
144
+ outcome,
145
+ transport: { ...fact.transport },
146
+ ...(fact.reaction === undefined ? {} : { reaction: { firstAt: fact.reaction.firstAt } }),
147
+ ...(judgement === undefined ? {} : { judgement }),
148
+ ...(fact.route === undefined ? {} : { route: { kind: fact.route.kind, originBindingId: fact.route.originBindingId } }),
149
+ ...(expiry === undefined ? {} : { expiry }),
150
+ };
151
+ }
152
+ function stable(value) {
153
+ if (value === null || typeof value !== 'object')
154
+ return JSON.stringify(value);
155
+ if (Array.isArray(value))
156
+ return `[${value.map(stable).join(',')}]`;
157
+ const record = value;
158
+ return `{${Object.keys(record).filter(key => record[key] !== undefined).sort()
159
+ .map(key => `${JSON.stringify(key)}:${stable(record[key])}`).join(',')}}`;
160
+ }
161
+ export function notificationOutcomeDigest(record) {
162
+ return createHash('sha256').update(stable(record)).digest('hex');
163
+ }
164
+ function deepFreeze(value) {
165
+ if (value !== null && typeof value === 'object') {
166
+ for (const entry of Object.values(value))
167
+ deepFreeze(entry);
168
+ Object.freeze(value);
169
+ }
170
+ return value;
171
+ }
172
+ function stored(row) {
173
+ return deepFreeze({
174
+ notificationId: row.notification_id, scopeKey: row.scope_key, version: row.version, digest: row.digest,
175
+ watermark: row.watermark, recordedAt: row.recorded_at, record: JSON.parse(row.record_json),
176
+ });
177
+ }
178
+ function emptyCounts() {
179
+ return Object.fromEntries(notificationOutcomes.map(outcome => [outcome, 0]));
180
+ }
181
+ /**
182
+ * Evaluation-owned revisable ledger keyed by notification (Delivery Outbox id).
183
+ * Each changed classification appends an immutable revision and advances the
184
+ * scope's notification watermark in one writer transaction; an unchanged
185
+ * digest only refreshes the check time. Nothing here touches task projections,
186
+ * the Evolution outbox or any parameter.
187
+ */
188
+ export class NotificationOutcomeLedger {
189
+ #database;
190
+ #now;
191
+ constructor(database, now) {
192
+ this.#database = database;
193
+ this.#now = now;
194
+ }
195
+ #transaction(fn) {
196
+ this.#database.exec('BEGIN IMMEDIATE');
197
+ try {
198
+ const value = fn();
199
+ this.#database.exec('COMMIT');
200
+ return value;
201
+ }
202
+ catch (error) {
203
+ this.#database.exec('ROLLBACK');
204
+ throw error;
205
+ }
206
+ }
207
+ /** Apply one fact; returns whether a new revision was appended. */
208
+ apply(factInput, responseWindowMs) {
209
+ const fact = normalizeNotificationOutcomeFact(factInput);
210
+ const { scopeKey } = canonicalEvaluationScope(fact.scope);
211
+ return this.#transaction(() => {
212
+ const now = this.#now();
213
+ const record = classifyNotificationOutcome(fact, now, responseWindowMs);
214
+ const digest = notificationOutcomeDigest(record);
215
+ const head = this.#database.prepare('SELECT scope_key, version, digest FROM evaluation_notification_outcome_heads WHERE notification_id=?')
216
+ .get(fact.outboxId);
217
+ if (head !== undefined && head.scope_key !== scopeKey) {
218
+ throw new EvaluationStoreError('version-conflict', 'notification outcome scope changed');
219
+ }
220
+ if (head?.digest === digest) {
221
+ this.#database.prepare('UPDATE evaluation_notification_outcome_heads SET last_checked_at=? WHERE notification_id=?').run(now, fact.outboxId);
222
+ return { revised: false, head: this.#get(fact.outboxId, head.version) };
223
+ }
224
+ const version = (head?.version ?? 0) + 1;
225
+ this.#database.prepare(`INSERT INTO evaluation_notification_watermarks(scope_key, watermark) VALUES (?, 1)
226
+ ON CONFLICT(scope_key) DO UPDATE SET watermark = watermark + 1`).run(scopeKey);
227
+ const watermark = this.#database.prepare('SELECT watermark FROM evaluation_notification_watermarks WHERE scope_key=?')
228
+ .get(scopeKey).watermark;
229
+ this.#database.prepare(`INSERT INTO evaluation_notification_outcome_revisions
230
+ (notification_id, version, scope_key, outcome, record_json, digest, watermark, recorded_at) VALUES (?,?,?,?,?,?,?,?)`)
231
+ .run(fact.outboxId, version, scopeKey, record.outcome, stable(record), digest, watermark, now);
232
+ if (head === undefined) {
233
+ this.#database.prepare(`INSERT INTO evaluation_notification_outcome_heads
234
+ (notification_id, scope_key, version, digest, outcome, occurred_at, watermark, last_checked_at) VALUES (?,?,?,?,?,?,?,?)`)
235
+ .run(fact.outboxId, scopeKey, version, digest, record.outcome, record.notifiedAt, watermark, now);
236
+ }
237
+ else {
238
+ this.#database.prepare(`UPDATE evaluation_notification_outcome_heads
239
+ SET version=?, digest=?, outcome=?, watermark=?, last_checked_at=? WHERE notification_id=?`)
240
+ .run(version, digest, record.outcome, watermark, now, fact.outboxId);
241
+ }
242
+ return { revised: true, head: this.#get(fact.outboxId, version) };
243
+ });
244
+ }
245
+ /** Mark a head as checked without a fact (e.g. Delivery no longer reports it). */
246
+ touch(notificationId) {
247
+ this.#database.prepare('UPDATE evaluation_notification_outcome_heads SET last_checked_at=? WHERE notification_id=?')
248
+ .run(this.#now(), notificationId);
249
+ }
250
+ syncCursor() {
251
+ return this.#database.prepare('SELECT after_sequence FROM evaluation_notification_sync_cursor WHERE id=1')
252
+ .get()?.after_sequence ?? 0;
253
+ }
254
+ advanceSyncCursor(afterSequence) {
255
+ this.#database.prepare(`INSERT INTO evaluation_notification_sync_cursor(id, after_sequence, updated_at) VALUES (1, ?, ?)
256
+ ON CONFLICT(id) DO UPDATE SET after_sequence=max(after_sequence, excluded.after_sequence), updated_at=excluded.updated_at`)
257
+ .run(afterSequence, this.#now());
258
+ }
259
+ /** Heads notified at or after `notifiedSince`, least recently checked first. */
260
+ dueForRefresh(notifiedSince, limit) {
261
+ return this.#database.prepare(`SELECT notification_id FROM evaluation_notification_outcome_heads
262
+ WHERE occurred_at >= ? ORDER BY last_checked_at, notification_id LIMIT ?`).all(notifiedSince, limit)
263
+ .map(row => row.notification_id);
264
+ }
265
+ #get(notificationId, version) {
266
+ const row = this.#database.prepare('SELECT * FROM evaluation_notification_outcome_revisions WHERE notification_id=? AND version=?')
267
+ .get(notificationId, version);
268
+ return row === undefined ? undefined : stored(row);
269
+ }
270
+ history(scopeInput, notificationId) {
271
+ const { scopeKey } = canonicalEvaluationScope(scopeInput);
272
+ const rows = this.#database.prepare(`SELECT r.* FROM evaluation_notification_outcome_revisions r
273
+ WHERE r.notification_id=? AND r.scope_key=? ORDER BY r.version`).all(notificationId, scopeKey);
274
+ if (rows.length === 0)
275
+ return undefined;
276
+ const revisions = rows.map(stored);
277
+ return Object.freeze({ head: revisions.at(-1), revisions: Object.freeze(revisions) });
278
+ }
279
+ feed(scopeInput, afterInput, limit) {
280
+ const { scopeKey } = canonicalEvaluationScope(scopeInput);
281
+ if (!Number.isSafeInteger(limit) || limit < 1 || limit > 100)
282
+ invalid('feed limit must be between 1 and 100');
283
+ if (afterInput !== undefined && (afterInput === null || typeof afterInput !== 'object' || Array.isArray(afterInput)
284
+ || Object.keys(afterInput).length !== 2 || afterInput.scopeKey !== scopeKey
285
+ || !Number.isSafeInteger(afterInput.watermark) || afterInput.watermark < 0))
286
+ invalid('feed cursor is invalid');
287
+ const after = afterInput?.watermark ?? 0;
288
+ this.#database.exec('BEGIN');
289
+ try {
290
+ const scopeWatermark = this.#database.prepare('SELECT watermark FROM evaluation_notification_watermarks WHERE scope_key=?')
291
+ .get(scopeKey)?.watermark ?? 0;
292
+ if (after > scopeWatermark)
293
+ invalid('feed cursor is ahead of scope');
294
+ const rows = this.#database.prepare(`SELECT r.* FROM evaluation_notification_outcome_heads h
295
+ JOIN evaluation_notification_outcome_revisions r ON r.notification_id=h.notification_id AND r.version=h.version
296
+ WHERE h.scope_key=? AND h.watermark>? ORDER BY h.watermark LIMIT ?`).all(scopeKey, after, limit + 1);
297
+ const items = rows.slice(0, limit).map(stored);
298
+ return Object.freeze({
299
+ items: Object.freeze(items),
300
+ nextCursor: Object.freeze({ scopeKey, watermark: items.at(-1)?.watermark ?? after }),
301
+ scopeWatermark,
302
+ hasMore: rows.length > limit,
303
+ });
304
+ }
305
+ finally {
306
+ this.#database.exec('COMMIT');
307
+ }
308
+ }
309
+ summary(scopeInput, fromNotifiedAt, toNotifiedAt) {
310
+ const { scope, scopeKey } = canonicalEvaluationScope(scopeInput);
311
+ const rows = this.#database.prepare(`SELECT h.outcome AS outcome, json_extract(r.record_json, '$.verdict') AS verdict, COUNT(*) AS count
312
+ FROM evaluation_notification_outcome_heads h
313
+ JOIN evaluation_notification_outcome_revisions r ON r.notification_id=h.notification_id AND r.version=h.version
314
+ WHERE h.scope_key=? AND h.occurred_at>=? AND h.occurred_at<? GROUP BY h.outcome, verdict`)
315
+ .all(scopeKey, fromNotifiedAt, toNotifiedAt);
316
+ const outcomes = emptyCounts();
317
+ const byVerdict = Object.fromEntries(verdicts.map(verdict => [verdict, emptyCounts()]));
318
+ let total = 0;
319
+ for (const row of rows) {
320
+ outcomes[row.outcome] += row.count;
321
+ byVerdict[row.verdict][row.outcome] += row.count;
322
+ total += row.count;
323
+ }
324
+ return deepFreeze({ scope, scopeKey, fromNotifiedAt, toNotifiedAt, total, outcomes, byVerdict });
325
+ }
326
+ /**
327
+ * Current heads in `[from, to)` notification time whose record names a work
328
+ * item, oldest first, at most `limit` (plus whether more exist). Read-only;
329
+ * a scan of the scope's heads in the window (no index on the work item).
330
+ */
331
+ workItemHeads(scopeInput, fromNotifiedAt, toNotifiedAt, limit) {
332
+ const { scopeKey } = canonicalEvaluationScope(scopeInput);
333
+ if (!Number.isSafeInteger(limit) || limit < 1 || limit > 10_000)
334
+ invalid('work item head limit is invalid');
335
+ const rows = this.#database.prepare(`SELECT r.* FROM evaluation_notification_outcome_heads h
336
+ JOIN evaluation_notification_outcome_revisions r ON r.notification_id=h.notification_id AND r.version=h.version
337
+ WHERE h.scope_key=? AND h.occurred_at>=? AND h.occurred_at<?
338
+ AND json_extract(r.record_json, '$.workItemId') IS NOT NULL
339
+ ORDER BY h.occurred_at, h.notification_id LIMIT ?`).all(scopeKey, fromNotifiedAt, toNotifiedAt, limit + 1);
340
+ return Object.freeze({ records: Object.freeze(rows.slice(0, limit).map(row => stored(row).record)), truncated: rows.length > limit });
341
+ }
342
+ counts() {
343
+ const heads = this.#database.prepare('SELECT COUNT(*) AS count FROM evaluation_notification_outcome_heads').get();
344
+ const revisions = this.#database.prepare('SELECT COUNT(*) AS count FROM evaluation_notification_outcome_revisions').get();
345
+ return { notifications: heads.count, revisions: revisions.count };
346
+ }
347
+ }
348
+ //# sourceMappingURL=notification-outcomes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification-outcomes.js","sourceRoot":"","sources":["../src/notification-outcomes.ts"],"names":[],"mappings":"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"}