@herdctl/core 5.5.0 → 5.7.0

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 (172) 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/index.d.ts +1 -1
  4. package/dist/config/index.d.ts.map +1 -1
  5. package/dist/config/index.js +3 -1
  6. package/dist/config/index.js.map +1 -1
  7. package/dist/config/schema.d.ts +10 -2
  8. package/dist/config/schema.d.ts.map +1 -1
  9. package/dist/config/schema.js +6 -2
  10. package/dist/config/schema.js.map +1 -1
  11. package/dist/distribution/__tests__/agent-discovery.test.d.ts +7 -0
  12. package/dist/distribution/__tests__/agent-discovery.test.d.ts.map +1 -0
  13. package/dist/distribution/__tests__/agent-discovery.test.js +443 -0
  14. package/dist/distribution/__tests__/agent-discovery.test.js.map +1 -0
  15. package/dist/distribution/__tests__/agent-info.test.d.ts +7 -0
  16. package/dist/distribution/__tests__/agent-info.test.d.ts.map +1 -0
  17. package/dist/distribution/__tests__/agent-info.test.js +568 -0
  18. package/dist/distribution/__tests__/agent-info.test.js.map +1 -0
  19. package/dist/distribution/__tests__/agent-remover.test.d.ts +7 -0
  20. package/dist/distribution/__tests__/agent-remover.test.d.ts.map +1 -0
  21. package/dist/distribution/__tests__/agent-remover.test.js +498 -0
  22. package/dist/distribution/__tests__/agent-remover.test.js.map +1 -0
  23. package/dist/distribution/__tests__/agent-repo-metadata.test.d.ts +5 -0
  24. package/dist/distribution/__tests__/agent-repo-metadata.test.d.ts.map +1 -0
  25. package/dist/distribution/__tests__/agent-repo-metadata.test.js +500 -0
  26. package/dist/distribution/__tests__/agent-repo-metadata.test.js.map +1 -0
  27. package/dist/distribution/__tests__/env-scanner.test.d.ts +5 -0
  28. package/dist/distribution/__tests__/env-scanner.test.d.ts.map +1 -0
  29. package/dist/distribution/__tests__/env-scanner.test.js +576 -0
  30. package/dist/distribution/__tests__/env-scanner.test.js.map +1 -0
  31. package/dist/distribution/__tests__/file-installer.test.d.ts +7 -0
  32. package/dist/distribution/__tests__/file-installer.test.d.ts.map +1 -0
  33. package/dist/distribution/__tests__/file-installer.test.js +714 -0
  34. package/dist/distribution/__tests__/file-installer.test.js.map +1 -0
  35. package/dist/distribution/__tests__/fleet-config-updater.test.d.ts +7 -0
  36. package/dist/distribution/__tests__/fleet-config-updater.test.d.ts.map +1 -0
  37. package/dist/distribution/__tests__/fleet-config-updater.test.js +531 -0
  38. package/dist/distribution/__tests__/fleet-config-updater.test.js.map +1 -0
  39. package/dist/distribution/__tests__/installation-metadata.test.d.ts +2 -0
  40. package/dist/distribution/__tests__/installation-metadata.test.d.ts.map +1 -0
  41. package/dist/distribution/__tests__/installation-metadata.test.js +292 -0
  42. package/dist/distribution/__tests__/installation-metadata.test.js.map +1 -0
  43. package/dist/distribution/__tests__/integration.test.d.ts +10 -0
  44. package/dist/distribution/__tests__/integration.test.d.ts.map +1 -0
  45. package/dist/distribution/__tests__/integration.test.js +522 -0
  46. package/dist/distribution/__tests__/integration.test.js.map +1 -0
  47. package/dist/distribution/__tests__/repository-fetcher.test.d.ts +5 -0
  48. package/dist/distribution/__tests__/repository-fetcher.test.d.ts.map +1 -0
  49. package/dist/distribution/__tests__/repository-fetcher.test.js +386 -0
  50. package/dist/distribution/__tests__/repository-fetcher.test.js.map +1 -0
  51. package/dist/distribution/__tests__/repository-validator.test.d.ts +7 -0
  52. package/dist/distribution/__tests__/repository-validator.test.d.ts.map +1 -0
  53. package/dist/distribution/__tests__/repository-validator.test.js +447 -0
  54. package/dist/distribution/__tests__/repository-validator.test.js.map +1 -0
  55. package/dist/distribution/__tests__/source-specifier.test.d.ts +5 -0
  56. package/dist/distribution/__tests__/source-specifier.test.d.ts.map +1 -0
  57. package/dist/distribution/__tests__/source-specifier.test.js +533 -0
  58. package/dist/distribution/__tests__/source-specifier.test.js.map +1 -0
  59. package/dist/distribution/agent-discovery.d.ts +81 -0
  60. package/dist/distribution/agent-discovery.d.ts.map +1 -0
  61. package/dist/distribution/agent-discovery.js +264 -0
  62. package/dist/distribution/agent-discovery.js.map +1 -0
  63. package/dist/distribution/agent-info.d.ts +86 -0
  64. package/dist/distribution/agent-info.d.ts.map +1 -0
  65. package/dist/distribution/agent-info.js +225 -0
  66. package/dist/distribution/agent-info.js.map +1 -0
  67. package/dist/distribution/agent-remover.d.ts +83 -0
  68. package/dist/distribution/agent-remover.d.ts.map +1 -0
  69. package/dist/distribution/agent-remover.js +222 -0
  70. package/dist/distribution/agent-remover.js.map +1 -0
  71. package/dist/distribution/agent-repo-metadata.d.ts +181 -0
  72. package/dist/distribution/agent-repo-metadata.d.ts.map +1 -0
  73. package/dist/distribution/agent-repo-metadata.js +143 -0
  74. package/dist/distribution/agent-repo-metadata.js.map +1 -0
  75. package/dist/distribution/env-scanner.d.ts +78 -0
  76. package/dist/distribution/env-scanner.d.ts.map +1 -0
  77. package/dist/distribution/env-scanner.js +144 -0
  78. package/dist/distribution/env-scanner.js.map +1 -0
  79. package/dist/distribution/file-installer.d.ts +80 -0
  80. package/dist/distribution/file-installer.d.ts.map +1 -0
  81. package/dist/distribution/file-installer.js +268 -0
  82. package/dist/distribution/file-installer.js.map +1 -0
  83. package/dist/distribution/fleet-config-updater.d.ts +96 -0
  84. package/dist/distribution/fleet-config-updater.d.ts.map +1 -0
  85. package/dist/distribution/fleet-config-updater.js +266 -0
  86. package/dist/distribution/fleet-config-updater.js.map +1 -0
  87. package/dist/distribution/index.d.ts +23 -0
  88. package/dist/distribution/index.d.ts.map +1 -0
  89. package/dist/distribution/index.js +42 -0
  90. package/dist/distribution/index.js.map +1 -0
  91. package/dist/distribution/installation-metadata.d.ts +191 -0
  92. package/dist/distribution/installation-metadata.d.ts.map +1 -0
  93. package/dist/distribution/installation-metadata.js +100 -0
  94. package/dist/distribution/installation-metadata.js.map +1 -0
  95. package/dist/distribution/repository-fetcher.d.ts +104 -0
  96. package/dist/distribution/repository-fetcher.d.ts.map +1 -0
  97. package/dist/distribution/repository-fetcher.js +246 -0
  98. package/dist/distribution/repository-fetcher.js.map +1 -0
  99. package/dist/distribution/repository-validator.d.ts +86 -0
  100. package/dist/distribution/repository-validator.d.ts.map +1 -0
  101. package/dist/distribution/repository-validator.js +296 -0
  102. package/dist/distribution/repository-validator.js.map +1 -0
  103. package/dist/distribution/source-specifier.d.ts +106 -0
  104. package/dist/distribution/source-specifier.d.ts.map +1 -0
  105. package/dist/distribution/source-specifier.js +247 -0
  106. package/dist/distribution/source-specifier.js.map +1 -0
  107. package/dist/fleet-manager/errors.d.ts +15 -0
  108. package/dist/fleet-manager/errors.d.ts.map +1 -1
  109. package/dist/fleet-manager/errors.js +16 -0
  110. package/dist/fleet-manager/errors.js.map +1 -1
  111. package/dist/fleet-manager/fleet-manager.d.ts.map +1 -1
  112. package/dist/fleet-manager/fleet-manager.js +31 -9
  113. package/dist/fleet-manager/fleet-manager.js.map +1 -1
  114. package/dist/index.d.ts +1 -0
  115. package/dist/index.d.ts.map +1 -1
  116. package/dist/index.js +2 -0
  117. package/dist/index.js.map +1 -1
  118. package/dist/runner/message-processor.d.ts.map +1 -1
  119. package/dist/runner/message-processor.js +7 -2
  120. package/dist/runner/message-processor.js.map +1 -1
  121. package/dist/runner/runtime/container-manager.js +1 -1
  122. package/dist/runner/runtime/container-manager.js.map +1 -1
  123. package/dist/scheduler/errors.d.ts +15 -0
  124. package/dist/scheduler/errors.d.ts.map +1 -1
  125. package/dist/scheduler/schedule-runner.d.ts.map +1 -1
  126. package/dist/scheduler/schedule-runner.js +6 -5
  127. package/dist/scheduler/schedule-runner.js.map +1 -1
  128. package/dist/state/__tests__/jsonl-parser.test.d.ts +5 -0
  129. package/dist/state/__tests__/jsonl-parser.test.d.ts.map +1 -0
  130. package/dist/state/__tests__/jsonl-parser.test.js +307 -0
  131. package/dist/state/__tests__/jsonl-parser.test.js.map +1 -0
  132. package/dist/state/__tests__/session-attribution.test.d.ts +2 -0
  133. package/dist/state/__tests__/session-attribution.test.d.ts.map +1 -0
  134. package/dist/state/__tests__/session-attribution.test.js +567 -0
  135. package/dist/state/__tests__/session-attribution.test.js.map +1 -0
  136. package/dist/state/__tests__/session-discovery.test.d.ts +2 -0
  137. package/dist/state/__tests__/session-discovery.test.d.ts.map +1 -0
  138. package/dist/state/__tests__/session-discovery.test.js +941 -0
  139. package/dist/state/__tests__/session-discovery.test.js.map +1 -0
  140. package/dist/state/__tests__/session-metadata.test.d.ts +2 -0
  141. package/dist/state/__tests__/session-metadata.test.d.ts.map +1 -0
  142. package/dist/state/__tests__/session-metadata.test.js +422 -0
  143. package/dist/state/__tests__/session-metadata.test.js.map +1 -0
  144. package/dist/state/__tests__/tool-parsing.test.d.ts +5 -0
  145. package/dist/state/__tests__/tool-parsing.test.d.ts.map +1 -0
  146. package/dist/state/__tests__/tool-parsing.test.js +315 -0
  147. package/dist/state/__tests__/tool-parsing.test.js.map +1 -0
  148. package/dist/state/index.d.ts +5 -0
  149. package/dist/state/index.d.ts.map +1 -1
  150. package/dist/state/index.js +10 -0
  151. package/dist/state/index.js.map +1 -1
  152. package/dist/state/jsonl-parser.d.ts +115 -0
  153. package/dist/state/jsonl-parser.d.ts.map +1 -0
  154. package/dist/state/jsonl-parser.js +437 -0
  155. package/dist/state/jsonl-parser.js.map +1 -0
  156. package/dist/state/session-attribution.d.ts +35 -0
  157. package/dist/state/session-attribution.d.ts.map +1 -0
  158. package/dist/state/session-attribution.js +179 -0
  159. package/dist/state/session-attribution.js.map +1 -0
  160. package/dist/state/session-discovery.d.ts +188 -0
  161. package/dist/state/session-discovery.d.ts.map +1 -0
  162. package/dist/state/session-discovery.js +513 -0
  163. package/dist/state/session-discovery.js.map +1 -0
  164. package/dist/state/session-metadata.d.ts +186 -0
  165. package/dist/state/session-metadata.d.ts.map +1 -0
  166. package/dist/state/session-metadata.js +297 -0
  167. package/dist/state/session-metadata.js.map +1 -0
  168. package/dist/state/tool-parsing.d.ts +88 -0
  169. package/dist/state/tool-parsing.d.ts.map +1 -0
  170. package/dist/state/tool-parsing.js +199 -0
  171. package/dist/state/tool-parsing.js.map +1 -0
  172. 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":""}