reflectt-node 0.1.21 → 0.1.22

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 (103) hide show
  1. package/README.md +64 -0
  2. package/dist/canvas-interactive.d.ts +53 -0
  3. package/dist/canvas-interactive.d.ts.map +1 -1
  4. package/dist/canvas-interactive.js +194 -0
  5. package/dist/canvas-interactive.js.map +1 -1
  6. package/dist/canvas-push.d.ts +2 -0
  7. package/dist/canvas-push.d.ts.map +1 -1
  8. package/dist/canvas-push.js +89 -0
  9. package/dist/canvas-push.js.map +1 -1
  10. package/dist/channels.d.ts +1 -1
  11. package/dist/intervention-template.d.ts +67 -0
  12. package/dist/intervention-template.d.ts.map +1 -0
  13. package/dist/intervention-template.js +290 -0
  14. package/dist/intervention-template.js.map +1 -0
  15. package/dist/request-tracker.d.ts +1 -0
  16. package/dist/request-tracker.d.ts.map +1 -1
  17. package/dist/request-tracker.js +16 -4
  18. package/dist/request-tracker.js.map +1 -1
  19. package/dist/server.d.ts.map +1 -1
  20. package/dist/server.js +144 -3
  21. package/dist/server.js.map +1 -1
  22. package/dist/stall-detector.d.ts +109 -0
  23. package/dist/stall-detector.d.ts.map +1 -0
  24. package/dist/stall-detector.js +279 -0
  25. package/dist/stall-detector.js.map +1 -0
  26. package/package.json +1 -1
  27. package/public/docs.md +9 -0
  28. package/dist/agent-config.test.d.ts +0 -2
  29. package/dist/agent-config.test.d.ts.map +0 -1
  30. package/dist/agent-config.test.js +0 -91
  31. package/dist/agent-config.test.js.map +0 -1
  32. package/dist/agent-exec-guardrail.test.d.ts +0 -2
  33. package/dist/agent-exec-guardrail.test.d.ts.map +0 -1
  34. package/dist/agent-exec-guardrail.test.js +0 -55
  35. package/dist/agent-exec-guardrail.test.js.map +0 -1
  36. package/dist/agent-memories.test.d.ts +0 -2
  37. package/dist/agent-memories.test.d.ts.map +0 -1
  38. package/dist/agent-memories.test.js +0 -327
  39. package/dist/agent-memories.test.js.map +0 -1
  40. package/dist/agent-messaging.test.d.ts +0 -2
  41. package/dist/agent-messaging.test.d.ts.map +0 -1
  42. package/dist/agent-messaging.test.js +0 -105
  43. package/dist/agent-messaging.test.js.map +0 -1
  44. package/dist/agent-runs.test.d.ts +0 -2
  45. package/dist/agent-runs.test.d.ts.map +0 -1
  46. package/dist/agent-runs.test.js +0 -386
  47. package/dist/agent-runs.test.js.map +0 -1
  48. package/dist/api.test.d.ts +0 -2
  49. package/dist/api.test.d.ts.map +0 -1
  50. package/dist/api.test.js +0 -99
  51. package/dist/api.test.js.map +0 -1
  52. package/dist/approval-queue.test.d.ts +0 -2
  53. package/dist/approval-queue.test.d.ts.map +0 -1
  54. package/dist/approval-queue.test.js +0 -118
  55. package/dist/approval-queue.test.js.map +0 -1
  56. package/dist/artifact-store.test.d.ts +0 -2
  57. package/dist/artifact-store.test.d.ts.map +0 -1
  58. package/dist/artifact-store.test.js +0 -119
  59. package/dist/artifact-store.test.js.map +0 -1
  60. package/dist/canvas-input.test.d.ts +0 -2
  61. package/dist/canvas-input.test.d.ts.map +0 -1
  62. package/dist/canvas-input.test.js +0 -96
  63. package/dist/canvas-input.test.js.map +0 -1
  64. package/dist/canvas-render.test.d.ts +0 -2
  65. package/dist/canvas-render.test.d.ts.map +0 -1
  66. package/dist/canvas-render.test.js +0 -95
  67. package/dist/canvas-render.test.js.map +0 -1
  68. package/dist/e2e-loop-proof.test.d.ts +0 -2
  69. package/dist/e2e-loop-proof.test.d.ts.map +0 -1
  70. package/dist/e2e-loop-proof.test.js +0 -114
  71. package/dist/e2e-loop-proof.test.js.map +0 -1
  72. package/dist/email-sms-send.test.d.ts +0 -2
  73. package/dist/email-sms-send.test.d.ts.map +0 -1
  74. package/dist/email-sms-send.test.js +0 -96
  75. package/dist/email-sms-send.test.js.map +0 -1
  76. package/dist/handoff-state.test.d.ts +0 -2
  77. package/dist/handoff-state.test.d.ts.map +0 -1
  78. package/dist/handoff-state.test.js +0 -102
  79. package/dist/handoff-state.test.js.map +0 -1
  80. package/dist/routing-enforcement.test.d.ts +0 -2
  81. package/dist/routing-enforcement.test.d.ts.map +0 -1
  82. package/dist/routing-enforcement.test.js +0 -62
  83. package/dist/routing-enforcement.test.js.map +0 -1
  84. package/dist/run-retention.test.d.ts +0 -2
  85. package/dist/run-retention.test.d.ts.map +0 -1
  86. package/dist/run-retention.test.js +0 -57
  87. package/dist/run-retention.test.js.map +0 -1
  88. package/dist/run-stream.test.d.ts +0 -2
  89. package/dist/run-stream.test.d.ts.map +0 -1
  90. package/dist/run-stream.test.js +0 -70
  91. package/dist/run-stream.test.js.map +0 -1
  92. package/dist/webhook-storage.test.d.ts +0 -2
  93. package/dist/webhook-storage.test.d.ts.map +0 -1
  94. package/dist/webhook-storage.test.js +0 -86
  95. package/dist/webhook-storage.test.js.map +0 -1
  96. package/dist/workflow-canvas-state.test.d.ts +0 -2
  97. package/dist/workflow-canvas-state.test.d.ts.map +0 -1
  98. package/dist/workflow-canvas-state.test.js +0 -53
  99. package/dist/workflow-canvas-state.test.js.map +0 -1
  100. package/dist/workflow-templates.test.d.ts +0 -2
  101. package/dist/workflow-templates.test.d.ts.map +0 -1
  102. package/dist/workflow-templates.test.js +0 -76
  103. package/dist/workflow-templates.test.js.map +0 -1
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Intervention Template Engine
3
+ *
4
+ * Context-aware stall re-engagement system.
5
+ * Selects and sends intervention messages when users stall on tasks.
6
+ *
7
+ * Done criteria:
8
+ * - InterventionTemplateEngine receives stall event and selects template based on stall_type
9
+ * - Templates support personalization fields: user_name, last_intent, active_task_title, last_agent_name
10
+ * - 3 template tiers: gentle nudge, contextual follow-up, handoff offer
11
+ * - Cooldown enforcement: max 2 interventions per 20 min, max 4 per day per user
12
+ * - Never resends same template if unanswered within 30 min
13
+ * - InterventionResult logged: sent_at, template_type, user_id, stall_id, response_at (null if no response)
14
+ * - Deduplication: same stall_type + same user within 30 min suppressed
15
+ */
16
+ export type StallType = 'intent_abandoned' | 'task_stalled' | 'review_pending' | 'handoff_waiting' | 'approval_pending';
17
+ export type TemplateTier = 'gentle_nudge' | 'contextual_followup' | 'handoff_offer';
18
+ export interface InterventionTemplate {
19
+ id: string;
20
+ tier: TemplateTier;
21
+ stallTypes: StallType[];
22
+ template: string;
23
+ priority: number;
24
+ }
25
+ export interface PersonalizationFields {
26
+ user_name?: string;
27
+ last_intent?: string;
28
+ active_task_title?: string;
29
+ last_agent_name?: string;
30
+ }
31
+ export interface StallEvent {
32
+ stallId: string;
33
+ userId: string;
34
+ stallType: StallType;
35
+ personalizations: PersonalizationFields;
36
+ timestamp: number;
37
+ }
38
+ export interface InterventionResult {
39
+ sent_at: number;
40
+ template_type: TemplateTier;
41
+ user_id: string;
42
+ stall_id: string;
43
+ response_at: number | null;
44
+ template_id: string;
45
+ }
46
+ export interface CooldownEntry {
47
+ count: number;
48
+ firstAt: number;
49
+ }
50
+ export interface EngineResult {
51
+ sent: boolean;
52
+ reason?: string;
53
+ result?: InterventionResult;
54
+ message?: string;
55
+ }
56
+ export declare function processStallEvent(event: StallEvent): EngineResult;
57
+ export declare function recordResponse(userId: string, templateId: string): void;
58
+ export declare function getInterventionStats(userId: string): {
59
+ twentyMin: number;
60
+ daily: number;
61
+ };
62
+ export declare function cleanupStaleEntries(): void;
63
+ /**
64
+ * Reset all intervention engine state — for testing only
65
+ */
66
+ export declare function _resetInterventionEngineState(): void;
67
+ //# sourceMappingURL=intervention-template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intervention-template.d.ts","sourceRoot":"","sources":["../src/intervention-template.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,MAAM,SAAS,GAAG,kBAAkB,GAAG,cAAc,GAAG,gBAAgB,GAAG,iBAAiB,GAAG,kBAAkB,CAAA;AAEvH,MAAM,MAAM,YAAY,GAAG,cAAc,GAAG,qBAAqB,GAAG,eAAe,CAAA;AAEnF,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,YAAY,CAAA;IAClB,UAAU,EAAE,SAAS,EAAE,CAAA;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,SAAS,CAAA;IACpB,gBAAgB,EAAE,qBAAqB,CAAA;IACvC,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAA;IACf,aAAa,EAAE,YAAY,CAAA;IAC3B,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;CAChB;AAqMD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,kBAAkB,CAAA;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,YAAY,CA+CjE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAOvE;AAID,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAazF;AAGD,wBAAgB,mBAAmB,IAAI,IAAI,CA6B1C;AAED;;GAEG;AACH,wBAAgB,6BAA6B,IAAI,IAAI,CAIpD"}
@@ -0,0 +1,290 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ /**
3
+ * Intervention Template Engine
4
+ *
5
+ * Context-aware stall re-engagement system.
6
+ * Selects and sends intervention messages when users stall on tasks.
7
+ *
8
+ * Done criteria:
9
+ * - InterventionTemplateEngine receives stall event and selects template based on stall_type
10
+ * - Templates support personalization fields: user_name, last_intent, active_task_title, last_agent_name
11
+ * - 3 template tiers: gentle nudge, contextual follow-up, handoff offer
12
+ * - Cooldown enforcement: max 2 interventions per 20 min, max 4 per day per user
13
+ * - Never resends same template if unanswered within 30 min
14
+ * - InterventionResult logged: sent_at, template_type, user_id, stall_id, response_at (null if no response)
15
+ * - Deduplication: same stall_type + same user within 30 min suppressed
16
+ */
17
+ // In-memory store for cooldowns and sent interventions
18
+ // Key: userId, Value: { rolling20min: CooldownEntry, daily: CooldownEntry }
19
+ const cooldownStore = new Map();
20
+ // Track sent templates to prevent duplicates within 30 min
21
+ // Key: `${userId}:${templateId}`, Value: timestamp
22
+ const sentTemplates = new Map();
23
+ // Track deduplication: same stall_type + same user within 30 min
24
+ // Key: `${userId}:${stallType}`, Value: timestamp
25
+ const deduplicationStore = new Map();
26
+ const COOLDOWN_20MIN_MS = 20 * 60 * 1000;
27
+ const COOLDOWN_DAILY_MS = 24 * 60 * 60 * 1000;
28
+ const DEDUP_WINDOW_MS = 30 * 60 * 1000;
29
+ const SENT_TEMPLATE_WINDOW_MS = 30 * 60 * 1000;
30
+ const MAX_20MIN = 2;
31
+ const MAX_DAILY = 4;
32
+ // ── Templates ──────────────────────────────────────────────────────────────────
33
+ const INTERVENTION_TEMPLATES = [
34
+ // Gentle nudge tier
35
+ {
36
+ id: 'gentle_nudge_intent',
37
+ tier: 'gentle_nudge',
38
+ stallTypes: ['intent_abandoned'],
39
+ template: 'Hey {{user_name}}! You started something exciting — "{{last_intent}}". Want to pick up where you left off?',
40
+ priority: 1,
41
+ },
42
+ {
43
+ id: 'gentle_nudge_task',
44
+ tier: 'gentle_nudge',
45
+ stallTypes: ['task_stalled'],
46
+ template: 'Quick check-in: "{{active_task_title}}" is waiting for you. Need any help?',
47
+ priority: 1,
48
+ },
49
+ {
50
+ id: 'gentle_nudge_review',
51
+ tier: 'gentle_nudge',
52
+ stallTypes: ['review_pending'],
53
+ template: 'Your review is waiting — just a quick look to keep things moving 🚀',
54
+ priority: 1,
55
+ },
56
+ {
57
+ id: 'gentle_nudge_handoff',
58
+ tier: 'gentle_nudge',
59
+ stallTypes: ['handoff_waiting'],
60
+ template: '{{last_agent_name}} has something ready for you. Ready to take a look?',
61
+ priority: 1,
62
+ },
63
+ // Contextual follow-up tier
64
+ {
65
+ id: 'contextual_intent',
66
+ tier: 'contextual_followup',
67
+ stallTypes: ['intent_abandoned'],
68
+ template: '{{user_name}}, still interested in "{{last_intent}}"? I can help you get started — just say the word.',
69
+ priority: 2,
70
+ },
71
+ {
72
+ id: 'contextual_task',
73
+ tier: 'contextual_followup',
74
+ stallTypes: ['task_stalled'],
75
+ template: 'Looks like "{{active_task_title}}" might need some attention. What\'s blocking you?',
76
+ priority: 2,
77
+ },
78
+ {
79
+ id: 'contextual_review',
80
+ tier: 'contextual_followup',
81
+ stallTypes: ['review_pending'],
82
+ template: '{{user_name}}, a review is waiting. Your feedback keeps the team moving forward!',
83
+ priority: 2,
84
+ },
85
+ {
86
+ id: 'contextual_handoff',
87
+ tier: 'contextual_followup',
88
+ stallTypes: ['handoff_waiting'],
89
+ template: '{{last_agent_name}} handed off work to you on "{{active_task_title}}". Ready to review?',
90
+ priority: 2,
91
+ },
92
+ // Handoff offer tier
93
+ {
94
+ id: 'handoff_intent',
95
+ tier: 'handoff_offer',
96
+ stallTypes: ['intent_abandoned'],
97
+ template: '{{user_name}}, want me to draft a start on "{{last_intent}}"? I can have something ready for your review in minutes.',
98
+ priority: 3,
99
+ },
100
+ {
101
+ id: 'handoff_task',
102
+ tier: 'handoff_offer',
103
+ stallTypes: ['task_stalled'],
104
+ template: 'Stuck on "{{active_task_title}}"? I can take a crack at it or find someone who can help.',
105
+ priority: 3,
106
+ },
107
+ {
108
+ id: 'handoff_review',
109
+ tier: 'handoff_offer',
110
+ stallTypes: ['review_pending'],
111
+ template: 'Need a second pair of eyes? I can walk you through the review or handle it if you\'re swamped.',
112
+ priority: 3,
113
+ },
114
+ {
115
+ id: 'handoff_approval',
116
+ tier: 'handoff_offer',
117
+ stallTypes: ['approval_pending'],
118
+ template: 'Waiting on your approval for "{{active_task_title}}". Want me to prep a summary to make it quick?',
119
+ priority: 3,
120
+ },
121
+ ];
122
+ // ── Template Selection ────────────────────────────────────────────────────────
123
+ function selectTemplate(stallType) {
124
+ const candidates = INTERVENTION_TEMPLATES.filter(t => t.stallTypes.includes(stallType));
125
+ if (candidates.length === 0)
126
+ return null;
127
+ // Sort by priority (gentler first)
128
+ candidates.sort((a, b) => a.priority - b.priority);
129
+ return candidates[0];
130
+ }
131
+ function interpolate(template, fields) {
132
+ let result = template;
133
+ for (const [key, value] of Object.entries(fields)) {
134
+ const placeholder = `{{${key}}}`;
135
+ result = result.replace(new RegExp(placeholder.replace(/[{}]/g, '\\$&'), 'g'), value ?? '');
136
+ }
137
+ return result;
138
+ }
139
+ // ── Cooldown & Deduplication ─────────────────────────────────────────────────
140
+ function checkCooldown(userId) {
141
+ const now = Date.now();
142
+ let entry = cooldownStore.get(userId);
143
+ if (!entry) {
144
+ entry = { rolling20min: { count: 0, firstAt: now }, daily: { count: 0, firstAt: now } };
145
+ cooldownStore.set(userId, entry);
146
+ }
147
+ // Check 20-min window
148
+ if (now - entry.rolling20min.firstAt > COOLDOWN_20MIN_MS) {
149
+ entry.rolling20min = { count: 0, firstAt: now };
150
+ }
151
+ if (entry.rolling20min.count >= MAX_20MIN) {
152
+ return { allowed: false, reason: '20-min cooldown' };
153
+ }
154
+ // Check daily window
155
+ if (now - entry.daily.firstAt > COOLDOWN_DAILY_MS) {
156
+ entry.daily = { count: 0, firstAt: now };
157
+ }
158
+ if (entry.daily.count >= MAX_DAILY) {
159
+ return { allowed: false, reason: 'daily cooldown' };
160
+ }
161
+ return { allowed: true };
162
+ }
163
+ function recordIntervention(userId) {
164
+ const now = Date.now();
165
+ let entry = cooldownStore.get(userId);
166
+ if (!entry) {
167
+ entry = { rolling20min: { count: 0, firstAt: now }, daily: { count: 0, firstAt: now } };
168
+ cooldownStore.set(userId, entry);
169
+ }
170
+ entry.rolling20min.count++;
171
+ entry.daily.count++;
172
+ }
173
+ function checkDeduplication(userId, stallType) {
174
+ const key = `${userId}:${stallType}`;
175
+ const lastSent = deduplicationStore.get(key);
176
+ if (lastSent && Date.now() - lastSent < DEDUP_WINDOW_MS) {
177
+ return true; // Suppressed
178
+ }
179
+ deduplicationStore.set(key, Date.now());
180
+ return false;
181
+ }
182
+ function checkTemplateDuplicate(userId, templateId) {
183
+ const key = `${userId}:${templateId}`;
184
+ const lastSent = sentTemplates.get(key);
185
+ if (lastSent && Date.now() - lastSent < SENT_TEMPLATE_WINDOW_MS) {
186
+ return true; // Already sent, unanswered
187
+ }
188
+ sentTemplates.set(key, Date.now());
189
+ return false;
190
+ }
191
+ export function processStallEvent(event) {
192
+ const { stallId, userId, stallType, personalizations, timestamp } = event;
193
+ const now = Date.now();
194
+ // Deduplication: same stall_type + same user within 30 min suppressed
195
+ if (checkDeduplication(userId, stallType)) {
196
+ return { sent: false, reason: 'deduplicated' };
197
+ }
198
+ // Select template based on stall_type
199
+ const template = selectTemplate(stallType);
200
+ if (!template) {
201
+ return { sent: false, reason: 'no template for stall_type' };
202
+ }
203
+ // Never resend same template if unanswered within 30 min
204
+ if (checkTemplateDuplicate(userId, template.id)) {
205
+ return { sent: false, reason: 'template already sent, unanswered within 30 min' };
206
+ }
207
+ // Cooldown enforcement
208
+ const cooldownCheck = checkCooldown(userId);
209
+ if (!cooldownCheck.allowed) {
210
+ return { sent: false, reason: cooldownCheck.reason ?? 'cooldown' };
211
+ }
212
+ // All checks passed - send intervention
213
+ const message = interpolate(template.template, personalizations);
214
+ // Record that we sent this
215
+ recordIntervention(userId);
216
+ sentTemplates.set(`${userId}:${template.id}`, now);
217
+ const result = {
218
+ sent_at: now,
219
+ template_type: template.tier,
220
+ user_id: userId,
221
+ stall_id: stallId,
222
+ response_at: null, // Will be updated if user responds
223
+ template_id: template.id,
224
+ };
225
+ return {
226
+ sent: true,
227
+ message, // interpolated intervention text
228
+ result,
229
+ };
230
+ }
231
+ export function recordResponse(userId, templateId) {
232
+ const key = `${userId}:${templateId}`;
233
+ const lastSent = sentTemplates.get(key);
234
+ if (lastSent) {
235
+ // Mark as responded - future sends of same template allowed
236
+ sentTemplates.delete(key);
237
+ }
238
+ }
239
+ // ── Utility ──────────────────────────────────────────────────────────────────
240
+ export function getInterventionStats(userId) {
241
+ const entry = cooldownStore.get(userId);
242
+ if (!entry)
243
+ return { twentyMin: 0, daily: 0 };
244
+ const now = Date.now();
245
+ let twentyMin = entry.rolling20min.count;
246
+ let daily = entry.daily.count;
247
+ // Reset if window expired
248
+ if (now - entry.rolling20min.firstAt > COOLDOWN_20MIN_MS)
249
+ twentyMin = 0;
250
+ if (now - entry.daily.firstAt > COOLDOWN_DAILY_MS)
251
+ daily = 0;
252
+ return { twentyMin, daily };
253
+ }
254
+ // Cleanup old entries periodically
255
+ export function cleanupStaleEntries() {
256
+ const now = Date.now();
257
+ // Cleanup deduplication store
258
+ for (const [key, timestamp] of deduplicationStore.entries()) {
259
+ if (now - timestamp > DEDUP_WINDOW_MS) {
260
+ deduplicationStore.delete(key);
261
+ }
262
+ }
263
+ // Cleanup sent templates
264
+ for (const [key, timestamp] of sentTemplates.entries()) {
265
+ if (now - timestamp > SENT_TEMPLATE_WINDOW_MS) {
266
+ sentTemplates.delete(key);
267
+ }
268
+ }
269
+ // Cleanup cooldown store (reset expired entries)
270
+ for (const [userId, entry] of cooldownStore.entries()) {
271
+ if (now - entry.rolling20min.firstAt > COOLDOWN_20MIN_MS) {
272
+ entry.rolling20min = { count: 0, firstAt: now };
273
+ }
274
+ if (now - entry.daily.firstAt > COOLDOWN_DAILY_MS) {
275
+ entry.daily = { count: 0, firstAt: now };
276
+ }
277
+ if (entry.rolling20min.count === 0 && entry.daily.count === 0) {
278
+ cooldownStore.delete(userId);
279
+ }
280
+ }
281
+ }
282
+ /**
283
+ * Reset all intervention engine state — for testing only
284
+ */
285
+ export function _resetInterventionEngineState() {
286
+ cooldownStore.clear();
287
+ sentTemplates.clear();
288
+ deduplicationStore.clear();
289
+ }
290
+ //# sourceMappingURL=intervention-template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intervention-template.js","sourceRoot":"","sources":["../src/intervention-template.ts"],"names":[],"mappings":"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"}
@@ -23,6 +23,7 @@ export declare function trackError(context: string, error: unknown): void;
23
23
  export declare function getRequestMetrics(): {
24
24
  total: number;
25
25
  errors: number;
26
+ serverErrors: number;
26
27
  uptimeMs: number;
27
28
  byGroup: Record<string, {
28
29
  requests: number;
@@ -1 +1 @@
1
- {"version":3,"file":"request-tracker.d.ts","sourceRoot":"","sources":["../src/request-tracker.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AAIH,UAAU,UAAU;IAClB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAgFD;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAwCtG;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAahE;AA6BD,wBAAgB,iBAAiB,IAAI;IACnC,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC7D,YAAY,EAAE,UAAU,EAAE,CAAA;IAC1B,eAAe,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACrF,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAA;CACxF,CAqCA;AAED,0BAA0B;AAC1B,wBAAgB,mBAAmB,IAAI,IAAI,CAS1C"}
1
+ {"version":3,"file":"request-tracker.d.ts","sourceRoot":"","sources":["../src/request-tracker.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AAIH,UAAU,UAAU;IAClB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAkFD;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CA+CtG;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAahE;AAgCD,wBAAgB,iBAAiB,IAAI;IACnC,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC7D,YAAY,EAAE,UAAU,EAAE,CAAA;IAC1B,eAAe,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACrF,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAA;CACxF,CAsCA;AAED,0BAA0B;AAC1B,wBAAgB,mBAAmB,IAAI,IAAI,CAU1C"}
@@ -35,10 +35,11 @@ const recentErrors = [];
35
35
  const errorBuckets = new Map();
36
36
  let totalRequests = 0;
37
37
  let totalErrors = 0;
38
+ let totalServerErrors = 0; // Only 5xx errors count toward error rate
38
39
  const startedAt = Date.now();
39
40
  // Rolling window state
40
41
  const rollingBuckets = [];
41
- let currentBucket = { requests: 0, errors: 0, startedAt: Date.now() };
42
+ let currentBucket = { requests: 0, errors: 0, serverErrors: 0, startedAt: Date.now() };
42
43
  // ── Core ───────────────────────────────────────────────────────────────────
43
44
  function classifyUrl(url) {
44
45
  for (const group of TRACKED_GROUPS) {
@@ -54,7 +55,7 @@ function rotateBuckets(now) {
54
55
  if (rollingBuckets.length > MAX_BUCKETS) {
55
56
  rollingBuckets.shift();
56
57
  }
57
- currentBucket = { requests: 0, errors: 0, startedAt: now };
58
+ currentBucket = { requests: 0, errors: 0, serverErrors: 0, startedAt: now };
58
59
  }
59
60
  }
60
61
  /**
@@ -69,6 +70,7 @@ export function trackRequest(method, url, statusCode, userAgent) {
69
70
  rotateBuckets(now);
70
71
  currentBucket.requests++;
71
72
  if (statusCode >= 400) {
73
+ // Track all errors (4xx and 5xx) for debugging
72
74
  totalErrors++;
73
75
  errorCounts[group] = (errorCounts[group] || 0) + 1;
74
76
  currentBucket.errors++;
@@ -82,6 +84,11 @@ export function trackRequest(method, url, statusCode, userAgent) {
82
84
  else {
83
85
  errorBuckets.set(bucketKey, { group, status: statusCode, count: 1, lastSeen: now });
84
86
  }
87
+ // Track 5xx as true errors for error rate (validation 4xx are expected rejections)
88
+ if (statusCode >= 500) {
89
+ totalServerErrors++;
90
+ currentBucket.serverErrors++;
91
+ }
85
92
  // Capture recent errors (both 4xx and 5xx, skip 404s to avoid noise)
86
93
  if (statusCode !== 404) {
87
94
  recentErrors.push({
@@ -122,14 +129,17 @@ function getRollingMetrics() {
122
129
  rotateBuckets(now);
123
130
  let requests = currentBucket.requests;
124
131
  let errors = currentBucket.errors;
132
+ let serverErrors = currentBucket.serverErrors;
125
133
  const windowStart = now - (MAX_BUCKETS * BUCKET_DURATION_MS);
126
134
  for (const bucket of rollingBuckets) {
127
135
  if (bucket.startedAt >= windowStart) {
128
136
  requests += bucket.requests;
129
137
  errors += bucket.errors;
138
+ serverErrors += bucket.serverErrors;
130
139
  }
131
140
  }
132
- const errorRate = requests > 0 ? Math.round((errors / requests) * 10000) / 100 : 0;
141
+ // Use server errors (5xx) for error rate - validation 4xx are expected rejections
142
+ const errorRate = requests > 0 ? Math.round((serverErrors / requests) * 10000) / 100 : 0;
133
143
  return {
134
144
  requests,
135
145
  errors,
@@ -164,6 +174,7 @@ export function getRequestMetrics() {
164
174
  return {
165
175
  total: totalRequests,
166
176
  errors: totalErrors,
177
+ serverErrors: totalServerErrors,
167
178
  uptimeMs,
168
179
  byGroup,
169
180
  recentErrors: [...recentErrors].reverse(), // Most recent first
@@ -176,6 +187,7 @@ export function getRequestMetrics() {
176
187
  export function resetRequestMetrics() {
177
188
  totalRequests = 0;
178
189
  totalErrors = 0;
190
+ totalServerErrors = 0;
179
191
  for (const key of Object.keys(requestCounts))
180
192
  delete requestCounts[key];
181
193
  for (const key of Object.keys(errorCounts))
@@ -183,6 +195,6 @@ export function resetRequestMetrics() {
183
195
  recentErrors.length = 0;
184
196
  errorBuckets.clear();
185
197
  rollingBuckets.length = 0;
186
- currentBucket = { requests: 0, errors: 0, startedAt: Date.now() };
198
+ currentBucket = { requests: 0, errors: 0, serverErrors: 0, startedAt: Date.now() };
187
199
  }
188
200
  //# sourceMappingURL=request-tracker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"request-tracker.js","sourceRoot":"","sources":["../src/request-tracker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"request-tracker.js","sourceRoot":"","sources":["../src/request-tracker.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,SAAS,CAAA;AAm8D9D,wBAAsB,YAAY,IAAI,OAAO,CAAC,eAAe,CAAC,CAyhhB7D"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,SAAS,CAAA;AAs8D9D,wBAAsB,YAAY,IAAI,OAAO,CAAC,eAAe,CAAC,CA+qhB7D"}