@herdctl/core 5.6.0 → 5.7.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.
- package/dist/config/__tests__/merge.test.js +1 -1
- package/dist/config/__tests__/merge.test.js.map +1 -1
- package/dist/config/schema.d.ts +10 -2
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +6 -2
- package/dist/config/schema.js.map +1 -1
- package/dist/scheduler/schedule-runner.d.ts.map +1 -1
- package/dist/scheduler/schedule-runner.js +6 -5
- package/dist/scheduler/schedule-runner.js.map +1 -1
- package/dist/state/__tests__/jsonl-parser.test.d.ts +5 -0
- package/dist/state/__tests__/jsonl-parser.test.d.ts.map +1 -0
- package/dist/state/__tests__/jsonl-parser.test.js +332 -0
- package/dist/state/__tests__/jsonl-parser.test.js.map +1 -0
- package/dist/state/__tests__/session-attribution.test.d.ts +2 -0
- package/dist/state/__tests__/session-attribution.test.d.ts.map +1 -0
- package/dist/state/__tests__/session-attribution.test.js +567 -0
- package/dist/state/__tests__/session-attribution.test.js.map +1 -0
- package/dist/state/__tests__/session-discovery.test.d.ts +2 -0
- package/dist/state/__tests__/session-discovery.test.d.ts.map +1 -0
- package/dist/state/__tests__/session-discovery.test.js +953 -0
- package/dist/state/__tests__/session-discovery.test.js.map +1 -0
- package/dist/state/__tests__/session-metadata.test.d.ts +2 -0
- package/dist/state/__tests__/session-metadata.test.d.ts.map +1 -0
- package/dist/state/__tests__/session-metadata.test.js +474 -0
- package/dist/state/__tests__/session-metadata.test.js.map +1 -0
- package/dist/state/__tests__/tool-parsing.test.d.ts +5 -0
- package/dist/state/__tests__/tool-parsing.test.d.ts.map +1 -0
- package/dist/state/__tests__/tool-parsing.test.js +315 -0
- package/dist/state/__tests__/tool-parsing.test.js.map +1 -0
- package/dist/state/index.d.ts +5 -0
- package/dist/state/index.d.ts.map +1 -1
- package/dist/state/index.js +10 -0
- package/dist/state/index.js.map +1 -1
- package/dist/state/jsonl-parser.d.ts +126 -0
- package/dist/state/jsonl-parser.d.ts.map +1 -0
- package/dist/state/jsonl-parser.js +482 -0
- package/dist/state/jsonl-parser.js.map +1 -0
- package/dist/state/session-attribution.d.ts +35 -0
- package/dist/state/session-attribution.d.ts.map +1 -0
- package/dist/state/session-attribution.js +179 -0
- package/dist/state/session-attribution.js.map +1 -0
- package/dist/state/session-discovery.d.ts +198 -0
- package/dist/state/session-discovery.d.ts.map +1 -0
- package/dist/state/session-discovery.js +555 -0
- package/dist/state/session-discovery.js.map +1 -0
- package/dist/state/session-metadata.d.ts +240 -0
- package/dist/state/session-metadata.d.ts.map +1 -0
- package/dist/state/session-metadata.js +377 -0
- package/dist/state/session-metadata.js.map +1 -0
- package/dist/state/tool-parsing.d.ts +88 -0
- package/dist/state/tool-parsing.d.ts.map +1 -0
- package/dist/state/tool-parsing.js +199 -0
- package/dist/state/tool-parsing.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,567 @@
|
|
|
1
|
+
import { mkdir, realpath, rm, writeFile } from "node:fs/promises";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
5
|
+
import yaml from "yaml";
|
|
6
|
+
import { buildAttributionIndex } from "../session-attribution.js";
|
|
7
|
+
// Mock listJobs
|
|
8
|
+
vi.mock("../job-metadata.js", () => ({
|
|
9
|
+
listJobs: vi.fn(),
|
|
10
|
+
}));
|
|
11
|
+
// Import after mock
|
|
12
|
+
import { listJobs } from "../job-metadata.js";
|
|
13
|
+
const mockListJobs = vi.mocked(listJobs);
|
|
14
|
+
// =============================================================================
|
|
15
|
+
// Test Helpers
|
|
16
|
+
// =============================================================================
|
|
17
|
+
/**
|
|
18
|
+
* Create a temporary directory for tests
|
|
19
|
+
*/
|
|
20
|
+
async function createTempDir() {
|
|
21
|
+
const baseDir = join(tmpdir(), `herdctl-attribution-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
22
|
+
await mkdir(baseDir, { recursive: true });
|
|
23
|
+
// Resolve to real path to handle macOS /var -> /private/var symlink
|
|
24
|
+
return await realpath(baseDir);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Create a platform session YAML file
|
|
28
|
+
*/
|
|
29
|
+
async function createPlatformSession(stateDir, platform, agentName, channels) {
|
|
30
|
+
const dir = join(stateDir, `${platform}-sessions`);
|
|
31
|
+
await mkdir(dir, { recursive: true });
|
|
32
|
+
const content = yaml.stringify({
|
|
33
|
+
version: 1,
|
|
34
|
+
agentName,
|
|
35
|
+
channels,
|
|
36
|
+
});
|
|
37
|
+
await writeFile(join(dir, `${agentName}.yaml`), content);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Create a minimal valid job object for mocking
|
|
41
|
+
*/
|
|
42
|
+
function createMockJob(overrides) {
|
|
43
|
+
return {
|
|
44
|
+
id: overrides.id ?? "job-2024-01-15-abc123",
|
|
45
|
+
agent: overrides.agent ?? "test-fleet/test-agent",
|
|
46
|
+
session_id: overrides.session_id ?? null,
|
|
47
|
+
trigger_type: overrides.trigger_type ?? "manual",
|
|
48
|
+
status: overrides.status ?? "completed",
|
|
49
|
+
started_at: overrides.started_at ?? "2024-01-15T10:00:00Z",
|
|
50
|
+
schedule: null,
|
|
51
|
+
exit_reason: null,
|
|
52
|
+
forked_from: null,
|
|
53
|
+
finished_at: null,
|
|
54
|
+
duration_seconds: null,
|
|
55
|
+
prompt: null,
|
|
56
|
+
summary: null,
|
|
57
|
+
output_file: null,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
// =============================================================================
|
|
61
|
+
// Tests
|
|
62
|
+
// =============================================================================
|
|
63
|
+
describe("buildAttributionIndex", () => {
|
|
64
|
+
let tempDir;
|
|
65
|
+
beforeEach(async () => {
|
|
66
|
+
tempDir = await createTempDir();
|
|
67
|
+
mockListJobs.mockReset();
|
|
68
|
+
});
|
|
69
|
+
afterEach(async () => {
|
|
70
|
+
await rm(tempDir, { recursive: true, force: true });
|
|
71
|
+
});
|
|
72
|
+
describe("job-attributed sessions", () => {
|
|
73
|
+
it("attributes session from job with trigger_type web", async () => {
|
|
74
|
+
mockListJobs.mockResolvedValue({
|
|
75
|
+
jobs: [
|
|
76
|
+
createMockJob({
|
|
77
|
+
session_id: "sess-web-1",
|
|
78
|
+
trigger_type: "web",
|
|
79
|
+
agent: "fleet/web-agent",
|
|
80
|
+
}),
|
|
81
|
+
],
|
|
82
|
+
errors: 0,
|
|
83
|
+
});
|
|
84
|
+
const index = await buildAttributionIndex(tempDir);
|
|
85
|
+
const attribution = index.getAttribute("sess-web-1");
|
|
86
|
+
expect(attribution).toEqual({
|
|
87
|
+
origin: "web",
|
|
88
|
+
agentName: "fleet/web-agent",
|
|
89
|
+
triggerType: "web",
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
it("attributes session from job with trigger_type schedule", async () => {
|
|
93
|
+
mockListJobs.mockResolvedValue({
|
|
94
|
+
jobs: [
|
|
95
|
+
createMockJob({
|
|
96
|
+
session_id: "sess-sched-1",
|
|
97
|
+
trigger_type: "schedule",
|
|
98
|
+
agent: "fleet/scheduled-agent",
|
|
99
|
+
}),
|
|
100
|
+
],
|
|
101
|
+
errors: 0,
|
|
102
|
+
});
|
|
103
|
+
const index = await buildAttributionIndex(tempDir);
|
|
104
|
+
const attribution = index.getAttribute("sess-sched-1");
|
|
105
|
+
expect(attribution).toEqual({
|
|
106
|
+
origin: "schedule",
|
|
107
|
+
agentName: "fleet/scheduled-agent",
|
|
108
|
+
triggerType: "schedule",
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
it("attributes session from job with trigger_type discord", async () => {
|
|
112
|
+
mockListJobs.mockResolvedValue({
|
|
113
|
+
jobs: [
|
|
114
|
+
createMockJob({
|
|
115
|
+
session_id: "sess-discord-job",
|
|
116
|
+
trigger_type: "discord",
|
|
117
|
+
agent: "fleet/discord-agent",
|
|
118
|
+
}),
|
|
119
|
+
],
|
|
120
|
+
errors: 0,
|
|
121
|
+
});
|
|
122
|
+
const index = await buildAttributionIndex(tempDir);
|
|
123
|
+
const attribution = index.getAttribute("sess-discord-job");
|
|
124
|
+
expect(attribution).toEqual({
|
|
125
|
+
origin: "discord",
|
|
126
|
+
agentName: "fleet/discord-agent",
|
|
127
|
+
triggerType: "discord",
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
it("attributes session from job with trigger_type slack", async () => {
|
|
131
|
+
mockListJobs.mockResolvedValue({
|
|
132
|
+
jobs: [
|
|
133
|
+
createMockJob({
|
|
134
|
+
session_id: "sess-slack-job",
|
|
135
|
+
trigger_type: "slack",
|
|
136
|
+
agent: "fleet/slack-agent",
|
|
137
|
+
}),
|
|
138
|
+
],
|
|
139
|
+
errors: 0,
|
|
140
|
+
});
|
|
141
|
+
const index = await buildAttributionIndex(tempDir);
|
|
142
|
+
const attribution = index.getAttribute("sess-slack-job");
|
|
143
|
+
expect(attribution).toEqual({
|
|
144
|
+
origin: "slack",
|
|
145
|
+
agentName: "fleet/slack-agent",
|
|
146
|
+
triggerType: "slack",
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
describe("trigger type mapping to native", () => {
|
|
151
|
+
it.each([
|
|
152
|
+
["manual", "native"],
|
|
153
|
+
["webhook", "native"],
|
|
154
|
+
["chat", "native"],
|
|
155
|
+
["fork", "native"],
|
|
156
|
+
])("maps trigger_type %s to origin %s", async (triggerType, expectedOrigin) => {
|
|
157
|
+
mockListJobs.mockResolvedValue({
|
|
158
|
+
jobs: [
|
|
159
|
+
createMockJob({
|
|
160
|
+
session_id: `sess-${triggerType}`,
|
|
161
|
+
trigger_type: triggerType,
|
|
162
|
+
agent: "fleet/agent",
|
|
163
|
+
}),
|
|
164
|
+
],
|
|
165
|
+
errors: 0,
|
|
166
|
+
});
|
|
167
|
+
const index = await buildAttributionIndex(tempDir);
|
|
168
|
+
const attribution = index.getAttribute(`sess-${triggerType}`);
|
|
169
|
+
expect(attribution.origin).toBe(expectedOrigin);
|
|
170
|
+
expect(attribution.triggerType).toBe(triggerType);
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
describe("platform YAML-attributed sessions", () => {
|
|
174
|
+
it("attributes session from discord YAML when not in jobs", async () => {
|
|
175
|
+
mockListJobs.mockResolvedValue({ jobs: [], errors: 0 });
|
|
176
|
+
await createPlatformSession(tempDir, "discord", "my-discord-bot", {
|
|
177
|
+
"channel-123": {
|
|
178
|
+
sessionId: "sess-discord-yaml",
|
|
179
|
+
lastMessageAt: "2024-01-15T10:00:00Z",
|
|
180
|
+
},
|
|
181
|
+
});
|
|
182
|
+
const index = await buildAttributionIndex(tempDir);
|
|
183
|
+
const attribution = index.getAttribute("sess-discord-yaml");
|
|
184
|
+
expect(attribution).toEqual({
|
|
185
|
+
origin: "discord",
|
|
186
|
+
agentName: "my-discord-bot",
|
|
187
|
+
triggerType: undefined,
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
it("attributes session from slack YAML when not in jobs", async () => {
|
|
191
|
+
mockListJobs.mockResolvedValue({ jobs: [], errors: 0 });
|
|
192
|
+
await createPlatformSession(tempDir, "slack", "my-slack-bot", {
|
|
193
|
+
"channel-456": {
|
|
194
|
+
sessionId: "sess-slack-yaml",
|
|
195
|
+
lastMessageAt: "2024-01-15T11:00:00Z",
|
|
196
|
+
},
|
|
197
|
+
});
|
|
198
|
+
const index = await buildAttributionIndex(tempDir);
|
|
199
|
+
const attribution = index.getAttribute("sess-slack-yaml");
|
|
200
|
+
expect(attribution).toEqual({
|
|
201
|
+
origin: "slack",
|
|
202
|
+
agentName: "my-slack-bot",
|
|
203
|
+
triggerType: undefined,
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
it("attributes session from web YAML when not in jobs", async () => {
|
|
207
|
+
mockListJobs.mockResolvedValue({ jobs: [], errors: 0 });
|
|
208
|
+
await createPlatformSession(tempDir, "web", "my-web-agent", {
|
|
209
|
+
"session-789": {
|
|
210
|
+
sessionId: "sess-web-yaml",
|
|
211
|
+
lastMessageAt: "2024-01-15T12:00:00Z",
|
|
212
|
+
},
|
|
213
|
+
});
|
|
214
|
+
const index = await buildAttributionIndex(tempDir);
|
|
215
|
+
const attribution = index.getAttribute("sess-web-yaml");
|
|
216
|
+
expect(attribution).toEqual({
|
|
217
|
+
origin: "web",
|
|
218
|
+
agentName: "my-web-agent",
|
|
219
|
+
triggerType: undefined,
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
it("handles multiple channels in a single YAML file", async () => {
|
|
223
|
+
mockListJobs.mockResolvedValue({ jobs: [], errors: 0 });
|
|
224
|
+
await createPlatformSession(tempDir, "discord", "multi-channel-bot", {
|
|
225
|
+
"channel-1": { sessionId: "sess-ch1", lastMessageAt: "2024-01-15T10:00:00Z" },
|
|
226
|
+
"channel-2": { sessionId: "sess-ch2", lastMessageAt: "2024-01-15T11:00:00Z" },
|
|
227
|
+
"channel-3": { sessionId: "sess-ch3", lastMessageAt: "2024-01-15T12:00:00Z" },
|
|
228
|
+
});
|
|
229
|
+
const index = await buildAttributionIndex(tempDir);
|
|
230
|
+
expect(index.getAttribute("sess-ch1").origin).toBe("discord");
|
|
231
|
+
expect(index.getAttribute("sess-ch2").origin).toBe("discord");
|
|
232
|
+
expect(index.getAttribute("sess-ch3").origin).toBe("discord");
|
|
233
|
+
expect(index.getAttribute("sess-ch1").agentName).toBe("multi-channel-bot");
|
|
234
|
+
});
|
|
235
|
+
});
|
|
236
|
+
describe("priority: job takes precedence over YAML", () => {
|
|
237
|
+
it("uses job attribution when session exists in both job and platform YAML", async () => {
|
|
238
|
+
const sharedSessionId = "sess-shared";
|
|
239
|
+
// Job says it's a web session
|
|
240
|
+
mockListJobs.mockResolvedValue({
|
|
241
|
+
jobs: [
|
|
242
|
+
createMockJob({
|
|
243
|
+
session_id: sharedSessionId,
|
|
244
|
+
trigger_type: "web",
|
|
245
|
+
agent: "fleet/job-agent",
|
|
246
|
+
}),
|
|
247
|
+
],
|
|
248
|
+
errors: 0,
|
|
249
|
+
});
|
|
250
|
+
// Slack YAML also has this session
|
|
251
|
+
await createPlatformSession(tempDir, "slack", "slack-bot", {
|
|
252
|
+
"channel-xyz": {
|
|
253
|
+
sessionId: sharedSessionId,
|
|
254
|
+
lastMessageAt: "2024-01-15T10:00:00Z",
|
|
255
|
+
},
|
|
256
|
+
});
|
|
257
|
+
const index = await buildAttributionIndex(tempDir);
|
|
258
|
+
const attribution = index.getAttribute(sharedSessionId);
|
|
259
|
+
// Job should win
|
|
260
|
+
expect(attribution).toEqual({
|
|
261
|
+
origin: "web",
|
|
262
|
+
agentName: "fleet/job-agent",
|
|
263
|
+
triggerType: "web",
|
|
264
|
+
});
|
|
265
|
+
});
|
|
266
|
+
});
|
|
267
|
+
describe("unattributed sessions", () => {
|
|
268
|
+
it("returns native origin for unknown session", async () => {
|
|
269
|
+
mockListJobs.mockResolvedValue({ jobs: [], errors: 0 });
|
|
270
|
+
const index = await buildAttributionIndex(tempDir);
|
|
271
|
+
const attribution = index.getAttribute("sess-unknown");
|
|
272
|
+
expect(attribution).toEqual({
|
|
273
|
+
origin: "native",
|
|
274
|
+
agentName: undefined,
|
|
275
|
+
triggerType: undefined,
|
|
276
|
+
});
|
|
277
|
+
});
|
|
278
|
+
it("returns native origin when session not in any source", async () => {
|
|
279
|
+
// Some jobs exist but not matching session
|
|
280
|
+
mockListJobs.mockResolvedValue({
|
|
281
|
+
jobs: [
|
|
282
|
+
createMockJob({
|
|
283
|
+
session_id: "sess-other",
|
|
284
|
+
trigger_type: "web",
|
|
285
|
+
agent: "fleet/agent",
|
|
286
|
+
}),
|
|
287
|
+
],
|
|
288
|
+
errors: 0,
|
|
289
|
+
});
|
|
290
|
+
// Some platform sessions exist but not matching
|
|
291
|
+
await createPlatformSession(tempDir, "discord", "bot", {
|
|
292
|
+
"ch-1": { sessionId: "sess-discord-other", lastMessageAt: "2024-01-15T10:00:00Z" },
|
|
293
|
+
});
|
|
294
|
+
const index = await buildAttributionIndex(tempDir);
|
|
295
|
+
const attribution = index.getAttribute("sess-not-found");
|
|
296
|
+
expect(attribution).toEqual({
|
|
297
|
+
origin: "native",
|
|
298
|
+
agentName: undefined,
|
|
299
|
+
triggerType: undefined,
|
|
300
|
+
});
|
|
301
|
+
});
|
|
302
|
+
});
|
|
303
|
+
describe("batch attribution (getAttributes)", () => {
|
|
304
|
+
it("returns correct Map for multiple session IDs", async () => {
|
|
305
|
+
mockListJobs.mockResolvedValue({
|
|
306
|
+
jobs: [
|
|
307
|
+
createMockJob({
|
|
308
|
+
id: "job-2024-01-15-job001",
|
|
309
|
+
session_id: "sess-job-web",
|
|
310
|
+
trigger_type: "web",
|
|
311
|
+
agent: "fleet/web-agent",
|
|
312
|
+
}),
|
|
313
|
+
createMockJob({
|
|
314
|
+
id: "job-2024-01-15-job002",
|
|
315
|
+
session_id: "sess-job-schedule",
|
|
316
|
+
trigger_type: "schedule",
|
|
317
|
+
agent: "fleet/cron-agent",
|
|
318
|
+
}),
|
|
319
|
+
],
|
|
320
|
+
errors: 0,
|
|
321
|
+
});
|
|
322
|
+
await createPlatformSession(tempDir, "discord", "discord-bot", {
|
|
323
|
+
"ch-1": { sessionId: "sess-discord", lastMessageAt: "2024-01-15T10:00:00Z" },
|
|
324
|
+
});
|
|
325
|
+
await createPlatformSession(tempDir, "slack", "slack-bot", {
|
|
326
|
+
"ch-2": { sessionId: "sess-slack", lastMessageAt: "2024-01-15T11:00:00Z" },
|
|
327
|
+
});
|
|
328
|
+
const index = await buildAttributionIndex(tempDir);
|
|
329
|
+
const results = index.getAttributes([
|
|
330
|
+
"sess-job-web",
|
|
331
|
+
"sess-job-schedule",
|
|
332
|
+
"sess-discord",
|
|
333
|
+
"sess-slack",
|
|
334
|
+
"sess-unknown",
|
|
335
|
+
]);
|
|
336
|
+
expect(results.size).toBe(5);
|
|
337
|
+
expect(results.get("sess-job-web")).toEqual({
|
|
338
|
+
origin: "web",
|
|
339
|
+
agentName: "fleet/web-agent",
|
|
340
|
+
triggerType: "web",
|
|
341
|
+
});
|
|
342
|
+
expect(results.get("sess-job-schedule")).toEqual({
|
|
343
|
+
origin: "schedule",
|
|
344
|
+
agentName: "fleet/cron-agent",
|
|
345
|
+
triggerType: "schedule",
|
|
346
|
+
});
|
|
347
|
+
expect(results.get("sess-discord")).toEqual({
|
|
348
|
+
origin: "discord",
|
|
349
|
+
agentName: "discord-bot",
|
|
350
|
+
triggerType: undefined,
|
|
351
|
+
});
|
|
352
|
+
expect(results.get("sess-slack")).toEqual({
|
|
353
|
+
origin: "slack",
|
|
354
|
+
agentName: "slack-bot",
|
|
355
|
+
triggerType: undefined,
|
|
356
|
+
});
|
|
357
|
+
expect(results.get("sess-unknown")).toEqual({
|
|
358
|
+
origin: "native",
|
|
359
|
+
agentName: undefined,
|
|
360
|
+
triggerType: undefined,
|
|
361
|
+
});
|
|
362
|
+
});
|
|
363
|
+
});
|
|
364
|
+
describe("empty jobs directory", () => {
|
|
365
|
+
it("uses YAML attribution when listJobs returns empty", async () => {
|
|
366
|
+
mockListJobs.mockResolvedValue({ jobs: [], errors: 0 });
|
|
367
|
+
await createPlatformSession(tempDir, "discord", "bot", {
|
|
368
|
+
"ch-1": { sessionId: "sess-yaml-only", lastMessageAt: "2024-01-15T10:00:00Z" },
|
|
369
|
+
});
|
|
370
|
+
const index = await buildAttributionIndex(tempDir);
|
|
371
|
+
const attribution = index.getAttribute("sess-yaml-only");
|
|
372
|
+
expect(attribution.origin).toBe("discord");
|
|
373
|
+
});
|
|
374
|
+
it("defaults to native when listJobs is empty and no YAML", async () => {
|
|
375
|
+
mockListJobs.mockResolvedValue({ jobs: [], errors: 0 });
|
|
376
|
+
const index = await buildAttributionIndex(tempDir);
|
|
377
|
+
const attribution = index.getAttribute("any-session");
|
|
378
|
+
expect(attribution.origin).toBe("native");
|
|
379
|
+
});
|
|
380
|
+
});
|
|
381
|
+
describe("malformed YAML handling", () => {
|
|
382
|
+
it("skips malformed YAML files and continues parsing others", async () => {
|
|
383
|
+
mockListJobs.mockResolvedValue({ jobs: [], errors: 0 });
|
|
384
|
+
// Create discord-sessions directory
|
|
385
|
+
const discordDir = join(tempDir, "discord-sessions");
|
|
386
|
+
await mkdir(discordDir, { recursive: true });
|
|
387
|
+
// Create a malformed YAML file
|
|
388
|
+
await writeFile(join(discordDir, "malformed-bot.yaml"), "not valid yaml: [[[", "utf-8");
|
|
389
|
+
// Create a valid YAML file
|
|
390
|
+
await createPlatformSession(tempDir, "discord", "valid-bot", {
|
|
391
|
+
"ch-1": { sessionId: "sess-valid", lastMessageAt: "2024-01-15T10:00:00Z" },
|
|
392
|
+
});
|
|
393
|
+
// Should not throw
|
|
394
|
+
const index = await buildAttributionIndex(tempDir);
|
|
395
|
+
// Valid file should still be indexed
|
|
396
|
+
expect(index.getAttribute("sess-valid").origin).toBe("discord");
|
|
397
|
+
});
|
|
398
|
+
it("skips YAML files with invalid schema and continues", async () => {
|
|
399
|
+
mockListJobs.mockResolvedValue({ jobs: [], errors: 0 });
|
|
400
|
+
// Create discord-sessions directory
|
|
401
|
+
const discordDir = join(tempDir, "discord-sessions");
|
|
402
|
+
await mkdir(discordDir, { recursive: true });
|
|
403
|
+
// Create YAML with invalid schema (missing required fields)
|
|
404
|
+
await writeFile(join(discordDir, "invalid-schema.yaml"), yaml.stringify({ foo: "bar" }), "utf-8");
|
|
405
|
+
// Create a valid YAML file
|
|
406
|
+
await createPlatformSession(tempDir, "discord", "valid-bot", {
|
|
407
|
+
"ch-1": { sessionId: "sess-valid-schema", lastMessageAt: "2024-01-15T10:00:00Z" },
|
|
408
|
+
});
|
|
409
|
+
const index = await buildAttributionIndex(tempDir);
|
|
410
|
+
// Valid file should still be indexed
|
|
411
|
+
expect(index.getAttribute("sess-valid-schema").origin).toBe("discord");
|
|
412
|
+
});
|
|
413
|
+
});
|
|
414
|
+
describe("missing platform directories", () => {
|
|
415
|
+
it("handles missing platform directories gracefully", async () => {
|
|
416
|
+
mockListJobs.mockResolvedValue({
|
|
417
|
+
jobs: [
|
|
418
|
+
createMockJob({
|
|
419
|
+
session_id: "sess-from-job",
|
|
420
|
+
trigger_type: "web",
|
|
421
|
+
agent: "fleet/agent",
|
|
422
|
+
}),
|
|
423
|
+
],
|
|
424
|
+
errors: 0,
|
|
425
|
+
});
|
|
426
|
+
// No platform directories exist at all
|
|
427
|
+
// Should not throw
|
|
428
|
+
const index = await buildAttributionIndex(tempDir);
|
|
429
|
+
// Job sessions should still be found
|
|
430
|
+
expect(index.getAttribute("sess-from-job").origin).toBe("web");
|
|
431
|
+
// Unknown sessions default to native
|
|
432
|
+
expect(index.getAttribute("unknown").origin).toBe("native");
|
|
433
|
+
});
|
|
434
|
+
it("handles partial platform directories", async () => {
|
|
435
|
+
mockListJobs.mockResolvedValue({ jobs: [], errors: 0 });
|
|
436
|
+
// Only discord-sessions exists, not slack-sessions or web-sessions
|
|
437
|
+
await createPlatformSession(tempDir, "discord", "discord-bot", {
|
|
438
|
+
"ch-1": { sessionId: "sess-discord-only", lastMessageAt: "2024-01-15T10:00:00Z" },
|
|
439
|
+
});
|
|
440
|
+
const index = await buildAttributionIndex(tempDir);
|
|
441
|
+
expect(index.getAttribute("sess-discord-only").origin).toBe("discord");
|
|
442
|
+
});
|
|
443
|
+
});
|
|
444
|
+
describe("job with null session_id", () => {
|
|
445
|
+
it("does not index jobs with null session_id", async () => {
|
|
446
|
+
mockListJobs.mockResolvedValue({
|
|
447
|
+
jobs: [
|
|
448
|
+
createMockJob({
|
|
449
|
+
id: "job-2024-01-15-null01",
|
|
450
|
+
session_id: null,
|
|
451
|
+
trigger_type: "web",
|
|
452
|
+
agent: "fleet/null-agent",
|
|
453
|
+
}),
|
|
454
|
+
createMockJob({
|
|
455
|
+
id: "job-2024-01-15-real01",
|
|
456
|
+
session_id: "sess-real",
|
|
457
|
+
trigger_type: "web",
|
|
458
|
+
agent: "fleet/real-agent",
|
|
459
|
+
}),
|
|
460
|
+
],
|
|
461
|
+
errors: 0,
|
|
462
|
+
});
|
|
463
|
+
const index = await buildAttributionIndex(tempDir);
|
|
464
|
+
// Real session should be found
|
|
465
|
+
expect(index.getAttribute("sess-real").origin).toBe("web");
|
|
466
|
+
// Null session shouldn't cause issues
|
|
467
|
+
expect(index.size).toBe(1);
|
|
468
|
+
});
|
|
469
|
+
});
|
|
470
|
+
describe("index size", () => {
|
|
471
|
+
it("reports correct unique session count", async () => {
|
|
472
|
+
mockListJobs.mockResolvedValue({
|
|
473
|
+
jobs: [
|
|
474
|
+
createMockJob({
|
|
475
|
+
id: "job-2024-01-15-job001",
|
|
476
|
+
session_id: "sess-job-1",
|
|
477
|
+
trigger_type: "web",
|
|
478
|
+
agent: "fleet/agent-1",
|
|
479
|
+
}),
|
|
480
|
+
createMockJob({
|
|
481
|
+
id: "job-2024-01-15-job002",
|
|
482
|
+
session_id: "sess-job-2",
|
|
483
|
+
trigger_type: "schedule",
|
|
484
|
+
agent: "fleet/agent-2",
|
|
485
|
+
}),
|
|
486
|
+
],
|
|
487
|
+
errors: 0,
|
|
488
|
+
});
|
|
489
|
+
// Add one new session via platform YAML
|
|
490
|
+
await createPlatformSession(tempDir, "discord", "discord-bot", {
|
|
491
|
+
"ch-1": { sessionId: "sess-platform-new", lastMessageAt: "2024-01-15T10:00:00Z" },
|
|
492
|
+
});
|
|
493
|
+
// Add one overlapping session (same as job-1) via platform YAML
|
|
494
|
+
await createPlatformSession(tempDir, "slack", "slack-bot", {
|
|
495
|
+
"ch-2": { sessionId: "sess-job-1", lastMessageAt: "2024-01-15T11:00:00Z" },
|
|
496
|
+
});
|
|
497
|
+
const index = await buildAttributionIndex(tempDir);
|
|
498
|
+
// 2 from jobs + 1 new from platform = 3 unique (overlapping one doesn't add)
|
|
499
|
+
expect(index.size).toBe(3);
|
|
500
|
+
});
|
|
501
|
+
it("returns 0 when no sessions indexed", async () => {
|
|
502
|
+
mockListJobs.mockResolvedValue({ jobs: [], errors: 0 });
|
|
503
|
+
const index = await buildAttributionIndex(tempDir);
|
|
504
|
+
expect(index.size).toBe(0);
|
|
505
|
+
});
|
|
506
|
+
});
|
|
507
|
+
describe("complete trigger type mapping", () => {
|
|
508
|
+
it.each([
|
|
509
|
+
["web", "web"],
|
|
510
|
+
["discord", "discord"],
|
|
511
|
+
["slack", "slack"],
|
|
512
|
+
["schedule", "schedule"],
|
|
513
|
+
["manual", "native"],
|
|
514
|
+
["webhook", "native"],
|
|
515
|
+
["chat", "native"],
|
|
516
|
+
["fork", "native"],
|
|
517
|
+
])("maps trigger_type '%s' to origin '%s'", async (triggerType, expectedOrigin) => {
|
|
518
|
+
mockListJobs.mockResolvedValue({
|
|
519
|
+
jobs: [
|
|
520
|
+
createMockJob({
|
|
521
|
+
session_id: `sess-trigger-${triggerType}`,
|
|
522
|
+
trigger_type: triggerType,
|
|
523
|
+
agent: `fleet/${triggerType}-agent`,
|
|
524
|
+
}),
|
|
525
|
+
],
|
|
526
|
+
errors: 0,
|
|
527
|
+
});
|
|
528
|
+
const index = await buildAttributionIndex(tempDir);
|
|
529
|
+
const attribution = index.getAttribute(`sess-trigger-${triggerType}`);
|
|
530
|
+
expect(attribution.origin).toBe(expectedOrigin);
|
|
531
|
+
expect(attribution.agentName).toBe(`fleet/${triggerType}-agent`);
|
|
532
|
+
expect(attribution.triggerType).toBe(triggerType);
|
|
533
|
+
});
|
|
534
|
+
});
|
|
535
|
+
describe("multiple YAML files per platform", () => {
|
|
536
|
+
it("indexes sessions from multiple YAML files in same platform directory", async () => {
|
|
537
|
+
mockListJobs.mockResolvedValue({ jobs: [], errors: 0 });
|
|
538
|
+
await createPlatformSession(tempDir, "discord", "bot-alpha", {
|
|
539
|
+
"ch-alpha": { sessionId: "sess-alpha", lastMessageAt: "2024-01-15T10:00:00Z" },
|
|
540
|
+
});
|
|
541
|
+
await createPlatformSession(tempDir, "discord", "bot-beta", {
|
|
542
|
+
"ch-beta": { sessionId: "sess-beta", lastMessageAt: "2024-01-15T11:00:00Z" },
|
|
543
|
+
});
|
|
544
|
+
await createPlatformSession(tempDir, "discord", "bot-gamma", {
|
|
545
|
+
"ch-gamma": { sessionId: "sess-gamma", lastMessageAt: "2024-01-15T12:00:00Z" },
|
|
546
|
+
});
|
|
547
|
+
const index = await buildAttributionIndex(tempDir);
|
|
548
|
+
expect(index.getAttribute("sess-alpha")).toEqual({
|
|
549
|
+
origin: "discord",
|
|
550
|
+
agentName: "bot-alpha",
|
|
551
|
+
triggerType: undefined,
|
|
552
|
+
});
|
|
553
|
+
expect(index.getAttribute("sess-beta")).toEqual({
|
|
554
|
+
origin: "discord",
|
|
555
|
+
agentName: "bot-beta",
|
|
556
|
+
triggerType: undefined,
|
|
557
|
+
});
|
|
558
|
+
expect(index.getAttribute("sess-gamma")).toEqual({
|
|
559
|
+
origin: "discord",
|
|
560
|
+
agentName: "bot-gamma",
|
|
561
|
+
triggerType: undefined,
|
|
562
|
+
});
|
|
563
|
+
expect(index.size).toBe(3);
|
|
564
|
+
});
|
|
565
|
+
});
|
|
566
|
+
});
|
|
567
|
+
//# sourceMappingURL=session-attribution.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-attribution.test.js","sourceRoot":"","sources":["../../../src/state/__tests__/session-attribution.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-discovery.test.d.ts","sourceRoot":"","sources":["../../../src/state/__tests__/session-discovery.test.ts"],"names":[],"mappings":""}
|