reflectt-node 0.1.21 → 0.1.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +64 -0
- package/dist/canvas-interactive.d.ts +53 -0
- package/dist/canvas-interactive.d.ts.map +1 -1
- package/dist/canvas-interactive.js +194 -0
- package/dist/canvas-interactive.js.map +1 -1
- package/dist/canvas-push.d.ts +2 -0
- package/dist/canvas-push.d.ts.map +1 -1
- package/dist/canvas-push.js +89 -0
- package/dist/canvas-push.js.map +1 -1
- package/dist/channels.d.ts +1 -1
- package/dist/intervention-template.d.ts +67 -0
- package/dist/intervention-template.d.ts.map +1 -0
- package/dist/intervention-template.js +290 -0
- package/dist/intervention-template.js.map +1 -0
- package/dist/request-tracker.d.ts +1 -0
- package/dist/request-tracker.d.ts.map +1 -1
- package/dist/request-tracker.js +16 -4
- package/dist/request-tracker.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +144 -3
- package/dist/server.js.map +1 -1
- package/dist/stall-detector.d.ts +109 -0
- package/dist/stall-detector.d.ts.map +1 -0
- package/dist/stall-detector.js +279 -0
- package/dist/stall-detector.js.map +1 -0
- package/package.json +1 -1
- package/public/docs.md +9 -0
- package/dist/agent-config.test.d.ts +0 -2
- package/dist/agent-config.test.d.ts.map +0 -1
- package/dist/agent-config.test.js +0 -91
- package/dist/agent-config.test.js.map +0 -1
- package/dist/agent-exec-guardrail.test.d.ts +0 -2
- package/dist/agent-exec-guardrail.test.d.ts.map +0 -1
- package/dist/agent-exec-guardrail.test.js +0 -55
- package/dist/agent-exec-guardrail.test.js.map +0 -1
- package/dist/agent-memories.test.d.ts +0 -2
- package/dist/agent-memories.test.d.ts.map +0 -1
- package/dist/agent-memories.test.js +0 -327
- package/dist/agent-memories.test.js.map +0 -1
- package/dist/agent-messaging.test.d.ts +0 -2
- package/dist/agent-messaging.test.d.ts.map +0 -1
- package/dist/agent-messaging.test.js +0 -105
- package/dist/agent-messaging.test.js.map +0 -1
- package/dist/agent-runs.test.d.ts +0 -2
- package/dist/agent-runs.test.d.ts.map +0 -1
- package/dist/agent-runs.test.js +0 -386
- package/dist/agent-runs.test.js.map +0 -1
- package/dist/api.test.d.ts +0 -2
- package/dist/api.test.d.ts.map +0 -1
- package/dist/api.test.js +0 -99
- package/dist/api.test.js.map +0 -1
- package/dist/approval-queue.test.d.ts +0 -2
- package/dist/approval-queue.test.d.ts.map +0 -1
- package/dist/approval-queue.test.js +0 -118
- package/dist/approval-queue.test.js.map +0 -1
- package/dist/artifact-store.test.d.ts +0 -2
- package/dist/artifact-store.test.d.ts.map +0 -1
- package/dist/artifact-store.test.js +0 -119
- package/dist/artifact-store.test.js.map +0 -1
- package/dist/canvas-input.test.d.ts +0 -2
- package/dist/canvas-input.test.d.ts.map +0 -1
- package/dist/canvas-input.test.js +0 -96
- package/dist/canvas-input.test.js.map +0 -1
- package/dist/canvas-render.test.d.ts +0 -2
- package/dist/canvas-render.test.d.ts.map +0 -1
- package/dist/canvas-render.test.js +0 -95
- package/dist/canvas-render.test.js.map +0 -1
- package/dist/e2e-loop-proof.test.d.ts +0 -2
- package/dist/e2e-loop-proof.test.d.ts.map +0 -1
- package/dist/e2e-loop-proof.test.js +0 -114
- package/dist/e2e-loop-proof.test.js.map +0 -1
- package/dist/email-sms-send.test.d.ts +0 -2
- package/dist/email-sms-send.test.d.ts.map +0 -1
- package/dist/email-sms-send.test.js +0 -96
- package/dist/email-sms-send.test.js.map +0 -1
- package/dist/handoff-state.test.d.ts +0 -2
- package/dist/handoff-state.test.d.ts.map +0 -1
- package/dist/handoff-state.test.js +0 -102
- package/dist/handoff-state.test.js.map +0 -1
- package/dist/routing-enforcement.test.d.ts +0 -2
- package/dist/routing-enforcement.test.d.ts.map +0 -1
- package/dist/routing-enforcement.test.js +0 -62
- package/dist/routing-enforcement.test.js.map +0 -1
- package/dist/run-retention.test.d.ts +0 -2
- package/dist/run-retention.test.d.ts.map +0 -1
- package/dist/run-retention.test.js +0 -57
- package/dist/run-retention.test.js.map +0 -1
- package/dist/run-stream.test.d.ts +0 -2
- package/dist/run-stream.test.d.ts.map +0 -1
- package/dist/run-stream.test.js +0 -70
- package/dist/run-stream.test.js.map +0 -1
- package/dist/webhook-storage.test.d.ts +0 -2
- package/dist/webhook-storage.test.d.ts.map +0 -1
- package/dist/webhook-storage.test.js +0 -86
- package/dist/webhook-storage.test.js.map +0 -1
- package/dist/workflow-canvas-state.test.d.ts +0 -2
- package/dist/workflow-canvas-state.test.d.ts.map +0 -1
- package/dist/workflow-canvas-state.test.js +0 -53
- package/dist/workflow-canvas-state.test.js.map +0 -1
- package/dist/workflow-templates.test.d.ts +0 -2
- package/dist/workflow-templates.test.d.ts.map +0 -1
- package/dist/workflow-templates.test.js +0 -76
- 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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"}
|
|
@@ -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;
|
|
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"}
|
package/dist/request-tracker.js
CHANGED
|
@@ -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
|
-
|
|
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":"AAAA,sCAAsC;AACtC,4BAA4B;
|
|
1
|
+
{"version":3,"file":"request-tracker.js","sourceRoot":"","sources":["../src/request-tracker.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|