@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.
Files changed (54) hide show
  1. package/dist/config/__tests__/merge.test.js +1 -1
  2. package/dist/config/__tests__/merge.test.js.map +1 -1
  3. package/dist/config/schema.d.ts +10 -2
  4. package/dist/config/schema.d.ts.map +1 -1
  5. package/dist/config/schema.js +6 -2
  6. package/dist/config/schema.js.map +1 -1
  7. package/dist/scheduler/schedule-runner.d.ts.map +1 -1
  8. package/dist/scheduler/schedule-runner.js +6 -5
  9. package/dist/scheduler/schedule-runner.js.map +1 -1
  10. package/dist/state/__tests__/jsonl-parser.test.d.ts +5 -0
  11. package/dist/state/__tests__/jsonl-parser.test.d.ts.map +1 -0
  12. package/dist/state/__tests__/jsonl-parser.test.js +332 -0
  13. package/dist/state/__tests__/jsonl-parser.test.js.map +1 -0
  14. package/dist/state/__tests__/session-attribution.test.d.ts +2 -0
  15. package/dist/state/__tests__/session-attribution.test.d.ts.map +1 -0
  16. package/dist/state/__tests__/session-attribution.test.js +567 -0
  17. package/dist/state/__tests__/session-attribution.test.js.map +1 -0
  18. package/dist/state/__tests__/session-discovery.test.d.ts +2 -0
  19. package/dist/state/__tests__/session-discovery.test.d.ts.map +1 -0
  20. package/dist/state/__tests__/session-discovery.test.js +953 -0
  21. package/dist/state/__tests__/session-discovery.test.js.map +1 -0
  22. package/dist/state/__tests__/session-metadata.test.d.ts +2 -0
  23. package/dist/state/__tests__/session-metadata.test.d.ts.map +1 -0
  24. package/dist/state/__tests__/session-metadata.test.js +474 -0
  25. package/dist/state/__tests__/session-metadata.test.js.map +1 -0
  26. package/dist/state/__tests__/tool-parsing.test.d.ts +5 -0
  27. package/dist/state/__tests__/tool-parsing.test.d.ts.map +1 -0
  28. package/dist/state/__tests__/tool-parsing.test.js +315 -0
  29. package/dist/state/__tests__/tool-parsing.test.js.map +1 -0
  30. package/dist/state/index.d.ts +5 -0
  31. package/dist/state/index.d.ts.map +1 -1
  32. package/dist/state/index.js +10 -0
  33. package/dist/state/index.js.map +1 -1
  34. package/dist/state/jsonl-parser.d.ts +126 -0
  35. package/dist/state/jsonl-parser.d.ts.map +1 -0
  36. package/dist/state/jsonl-parser.js +482 -0
  37. package/dist/state/jsonl-parser.js.map +1 -0
  38. package/dist/state/session-attribution.d.ts +35 -0
  39. package/dist/state/session-attribution.d.ts.map +1 -0
  40. package/dist/state/session-attribution.js +179 -0
  41. package/dist/state/session-attribution.js.map +1 -0
  42. package/dist/state/session-discovery.d.ts +198 -0
  43. package/dist/state/session-discovery.d.ts.map +1 -0
  44. package/dist/state/session-discovery.js +555 -0
  45. package/dist/state/session-discovery.js.map +1 -0
  46. package/dist/state/session-metadata.d.ts +240 -0
  47. package/dist/state/session-metadata.d.ts.map +1 -0
  48. package/dist/state/session-metadata.js +377 -0
  49. package/dist/state/session-metadata.js.map +1 -0
  50. package/dist/state/tool-parsing.d.ts +88 -0
  51. package/dist/state/tool-parsing.d.ts.map +1 -0
  52. package/dist/state/tool-parsing.js +199 -0
  53. package/dist/state/tool-parsing.js.map +1 -0
  54. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=session-discovery.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-discovery.test.d.ts","sourceRoot":"","sources":["../../../src/state/__tests__/session-discovery.test.ts"],"names":[],"mappings":""}