@herdctl/core 0.0.2 → 0.2.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 (101) hide show
  1. package/LICENSE +21 -0
  2. package/dist/config/__tests__/agent.test.js +30 -0
  3. package/dist/config/__tests__/agent.test.js.map +1 -1
  4. package/dist/config/__tests__/merge.test.js +1 -1
  5. package/dist/config/__tests__/merge.test.js.map +1 -1
  6. package/dist/config/index.d.ts +1 -1
  7. package/dist/config/index.d.ts.map +1 -1
  8. package/dist/config/index.js +3 -1
  9. package/dist/config/index.js.map +1 -1
  10. package/dist/config/schema.d.ts +1005 -3
  11. package/dist/config/schema.d.ts.map +1 -1
  12. package/dist/config/schema.js +87 -4
  13. package/dist/config/schema.js.map +1 -1
  14. package/dist/fleet-manager/__tests__/coverage.test.js +6 -2
  15. package/dist/fleet-manager/__tests__/coverage.test.js.map +1 -1
  16. package/dist/fleet-manager/__tests__/integration.test.js +5 -0
  17. package/dist/fleet-manager/__tests__/integration.test.js.map +1 -1
  18. package/dist/fleet-manager/__tests__/job-control.test.js +13 -14
  19. package/dist/fleet-manager/__tests__/job-control.test.js.map +1 -1
  20. package/dist/fleet-manager/__tests__/reload.test.js +13 -3
  21. package/dist/fleet-manager/__tests__/reload.test.js.map +1 -1
  22. package/dist/fleet-manager/__tests__/status-queries.test.js +6 -0
  23. package/dist/fleet-manager/__tests__/status-queries.test.js.map +1 -1
  24. package/dist/fleet-manager/__tests__/trigger.test.js +10 -2
  25. package/dist/fleet-manager/__tests__/trigger.test.js.map +1 -1
  26. package/dist/fleet-manager/config-reload.d.ts +1 -1
  27. package/dist/fleet-manager/config-reload.js +1 -1
  28. package/dist/fleet-manager/fleet-manager.d.ts +1 -0
  29. package/dist/fleet-manager/fleet-manager.d.ts.map +1 -1
  30. package/dist/fleet-manager/fleet-manager.js +1 -0
  31. package/dist/fleet-manager/fleet-manager.js.map +1 -1
  32. package/dist/fleet-manager/job-control.d.ts +41 -0
  33. package/dist/fleet-manager/job-control.d.ts.map +1 -1
  34. package/dist/fleet-manager/job-control.js +243 -20
  35. package/dist/fleet-manager/job-control.js.map +1 -1
  36. package/dist/fleet-manager/schedule-executor.d.ts +20 -0
  37. package/dist/fleet-manager/schedule-executor.d.ts.map +1 -1
  38. package/dist/fleet-manager/schedule-executor.js +113 -3
  39. package/dist/fleet-manager/schedule-executor.js.map +1 -1
  40. package/dist/fleet-manager/types.d.ts +18 -0
  41. package/dist/fleet-manager/types.d.ts.map +1 -1
  42. package/dist/hooks/__tests__/discord-runner.test.d.ts +5 -0
  43. package/dist/hooks/__tests__/discord-runner.test.d.ts.map +1 -0
  44. package/dist/hooks/__tests__/discord-runner.test.js +606 -0
  45. package/dist/hooks/__tests__/discord-runner.test.js.map +1 -0
  46. package/dist/hooks/__tests__/hook-executor.test.d.ts +5 -0
  47. package/dist/hooks/__tests__/hook-executor.test.d.ts.map +1 -0
  48. package/dist/hooks/__tests__/hook-executor.test.js +443 -0
  49. package/dist/hooks/__tests__/hook-executor.test.js.map +1 -0
  50. package/dist/hooks/__tests__/shell-runner.test.d.ts +5 -0
  51. package/dist/hooks/__tests__/shell-runner.test.d.ts.map +1 -0
  52. package/dist/hooks/__tests__/shell-runner.test.js +201 -0
  53. package/dist/hooks/__tests__/shell-runner.test.js.map +1 -0
  54. package/dist/hooks/__tests__/webhook-runner.test.d.ts +5 -0
  55. package/dist/hooks/__tests__/webhook-runner.test.d.ts.map +1 -0
  56. package/dist/hooks/__tests__/webhook-runner.test.js +453 -0
  57. package/dist/hooks/__tests__/webhook-runner.test.js.map +1 -0
  58. package/dist/hooks/hook-executor.d.ts +129 -0
  59. package/dist/hooks/hook-executor.d.ts.map +1 -0
  60. package/dist/hooks/hook-executor.js +195 -0
  61. package/dist/hooks/hook-executor.js.map +1 -0
  62. package/dist/hooks/index.d.ts +15 -0
  63. package/dist/hooks/index.d.ts.map +1 -0
  64. package/dist/hooks/index.js +18 -0
  65. package/dist/hooks/index.js.map +1 -0
  66. package/dist/hooks/runners/discord.d.ts +66 -0
  67. package/dist/hooks/runners/discord.d.ts.map +1 -0
  68. package/dist/hooks/runners/discord.js +294 -0
  69. package/dist/hooks/runners/discord.js.map +1 -0
  70. package/dist/hooks/runners/shell.d.ts +71 -0
  71. package/dist/hooks/runners/shell.d.ts.map +1 -0
  72. package/dist/hooks/runners/shell.js +177 -0
  73. package/dist/hooks/runners/shell.js.map +1 -0
  74. package/dist/hooks/runners/webhook.d.ts +66 -0
  75. package/dist/hooks/runners/webhook.d.ts.map +1 -0
  76. package/dist/hooks/runners/webhook.js +163 -0
  77. package/dist/hooks/runners/webhook.js.map +1 -0
  78. package/dist/hooks/types.d.ts +196 -0
  79. package/dist/hooks/types.d.ts.map +1 -0
  80. package/dist/hooks/types.js +12 -0
  81. package/dist/hooks/types.js.map +1 -0
  82. package/dist/index.d.ts +1 -0
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/index.js +2 -0
  85. package/dist/index.js.map +1 -1
  86. package/dist/runner/__tests__/sdk-adapter.test.js +4 -3
  87. package/dist/runner/__tests__/sdk-adapter.test.js.map +1 -1
  88. package/dist/runner/message-processor.d.ts +5 -1
  89. package/dist/runner/message-processor.d.ts.map +1 -1
  90. package/dist/runner/message-processor.js +238 -18
  91. package/dist/runner/message-processor.js.map +1 -1
  92. package/dist/runner/sdk-adapter.d.ts.map +1 -1
  93. package/dist/runner/sdk-adapter.js +8 -1
  94. package/dist/runner/sdk-adapter.js.map +1 -1
  95. package/dist/runner/types.d.ts +23 -2
  96. package/dist/runner/types.d.ts.map +1 -1
  97. package/dist/scheduler/scheduler.d.ts.map +1 -1
  98. package/dist/scheduler/scheduler.js +9 -0
  99. package/dist/scheduler/scheduler.js.map +1 -1
  100. package/dist/state/schemas/job-metadata.d.ts +4 -4
  101. package/package.json +1 -1
@@ -0,0 +1,606 @@
1
+ /**
2
+ * Tests for DiscordHookRunner
3
+ */
4
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
5
+ import { DiscordHookRunner } from "../runners/discord.js";
6
+ describe("DiscordHookRunner", () => {
7
+ // Create a mock logger
8
+ const mockLogger = {
9
+ debug: vi.fn(),
10
+ info: vi.fn(),
11
+ warn: vi.fn(),
12
+ error: vi.fn(),
13
+ };
14
+ // Create a sample hook context
15
+ const sampleContext = {
16
+ event: "completed",
17
+ job: {
18
+ id: "job-2024-01-15-abc123",
19
+ agentId: "test-agent",
20
+ scheduleName: "daily-run",
21
+ startedAt: "2024-01-15T10:00:00.000Z",
22
+ completedAt: "2024-01-15T10:05:00.000Z",
23
+ durationMs: 300000,
24
+ },
25
+ result: {
26
+ success: true,
27
+ output: "Job completed successfully",
28
+ },
29
+ agent: {
30
+ id: "test-agent",
31
+ name: "Test Agent",
32
+ },
33
+ };
34
+ // Store original env
35
+ const originalEnv = { ...process.env };
36
+ beforeEach(() => {
37
+ vi.clearAllMocks();
38
+ // Reset env before each test
39
+ process.env = { ...originalEnv };
40
+ // Set up a default test token
41
+ process.env.DISCORD_BOT_TOKEN = "test-bot-token-12345";
42
+ });
43
+ afterEach(() => {
44
+ // Restore original env
45
+ process.env = originalEnv;
46
+ });
47
+ describe("execute", () => {
48
+ it("should POST to Discord API successfully", async () => {
49
+ const mockFetch = vi.fn().mockResolvedValue({
50
+ ok: true,
51
+ status: 200,
52
+ statusText: "OK",
53
+ text: () => Promise.resolve('{"id": "123456"}'),
54
+ });
55
+ const runner = new DiscordHookRunner({
56
+ logger: mockLogger,
57
+ fetch: mockFetch,
58
+ });
59
+ const config = {
60
+ type: "discord",
61
+ channel_id: "987654321",
62
+ bot_token_env: "DISCORD_BOT_TOKEN",
63
+ };
64
+ const result = await runner.execute(config, sampleContext);
65
+ expect(result.success).toBe(true);
66
+ expect(result.hookType).toBe("discord");
67
+ expect(result.durationMs).toBeGreaterThanOrEqual(0);
68
+ expect(result.output).toBe('{"id": "123456"}');
69
+ // Verify fetch was called correctly
70
+ expect(mockFetch).toHaveBeenCalledTimes(1);
71
+ const [url, options] = mockFetch.mock.calls[0];
72
+ expect(url).toBe("https://discord.com/api/v10/channels/987654321/messages");
73
+ expect(options.method).toBe("POST");
74
+ expect(options.headers["Content-Type"]).toBe("application/json");
75
+ expect(options.headers["Authorization"]).toBe("Bot test-bot-token-12345");
76
+ expect(mockLogger.info).toHaveBeenCalled();
77
+ });
78
+ it("should include correct embed structure in request body", async () => {
79
+ const mockFetch = vi.fn().mockResolvedValue({
80
+ ok: true,
81
+ status: 200,
82
+ statusText: "OK",
83
+ text: () => Promise.resolve(""),
84
+ });
85
+ const runner = new DiscordHookRunner({
86
+ logger: mockLogger,
87
+ fetch: mockFetch,
88
+ });
89
+ const config = {
90
+ type: "discord",
91
+ channel_id: "987654321",
92
+ bot_token_env: "DISCORD_BOT_TOKEN",
93
+ };
94
+ await runner.execute(config, sampleContext);
95
+ const [, options] = mockFetch.mock.calls[0];
96
+ const body = JSON.parse(options.body);
97
+ // Verify embed structure
98
+ expect(body.embeds).toHaveLength(1);
99
+ const embed = body.embeds[0];
100
+ expect(embed.title).toBe("✅ Job Completed");
101
+ expect(embed.color).toBe(0x22c55e); // green
102
+ expect(embed.timestamp).toBe("2024-01-15T10:05:00.000Z");
103
+ expect(embed.footer.text).toBe("herdctl");
104
+ // Verify fields
105
+ const fieldNames = embed.fields.map((f) => f.name);
106
+ expect(fieldNames).toContain("Agent");
107
+ expect(fieldNames).toContain("Job ID");
108
+ expect(fieldNames).toContain("Duration");
109
+ expect(fieldNames).toContain("Schedule");
110
+ expect(fieldNames).toContain("Output");
111
+ // Verify field values
112
+ const agentField = embed.fields.find((f) => f.name === "Agent");
113
+ expect(agentField.value).toBe("Test Agent");
114
+ const jobIdField = embed.fields.find((f) => f.name === "Job ID");
115
+ expect(jobIdField.value).toBe("`job-2024-01-15-abc123`");
116
+ const durationField = embed.fields.find((f) => f.name === "Duration");
117
+ expect(durationField.value).toBe("5m"); // 300000ms = 5 minutes
118
+ });
119
+ it("should use red color for failed events", async () => {
120
+ const mockFetch = vi.fn().mockResolvedValue({
121
+ ok: true,
122
+ status: 200,
123
+ statusText: "OK",
124
+ text: () => Promise.resolve(""),
125
+ });
126
+ const runner = new DiscordHookRunner({
127
+ logger: mockLogger,
128
+ fetch: mockFetch,
129
+ });
130
+ const failedContext = {
131
+ ...sampleContext,
132
+ event: "failed",
133
+ result: {
134
+ success: false,
135
+ output: "Job failed",
136
+ error: "Connection timeout",
137
+ },
138
+ };
139
+ const config = {
140
+ type: "discord",
141
+ channel_id: "987654321",
142
+ bot_token_env: "DISCORD_BOT_TOKEN",
143
+ };
144
+ await runner.execute(config, failedContext);
145
+ const [, options] = mockFetch.mock.calls[0];
146
+ const body = JSON.parse(options.body);
147
+ expect(body.embeds[0].title).toBe("❌ Job Failed");
148
+ expect(body.embeds[0].color).toBe(0xef4444); // red
149
+ // Verify error field is included
150
+ const errorField = body.embeds[0].fields.find((f) => f.name === "Error");
151
+ expect(errorField).toBeDefined();
152
+ expect(errorField.value).toContain("Connection timeout");
153
+ });
154
+ it("should use amber color for timeout events", async () => {
155
+ const mockFetch = vi.fn().mockResolvedValue({
156
+ ok: true,
157
+ status: 200,
158
+ statusText: "OK",
159
+ text: () => Promise.resolve(""),
160
+ });
161
+ const runner = new DiscordHookRunner({
162
+ logger: mockLogger,
163
+ fetch: mockFetch,
164
+ });
165
+ const timeoutContext = {
166
+ ...sampleContext,
167
+ event: "timeout",
168
+ };
169
+ const config = {
170
+ type: "discord",
171
+ channel_id: "987654321",
172
+ bot_token_env: "DISCORD_BOT_TOKEN",
173
+ };
174
+ await runner.execute(config, timeoutContext);
175
+ const [, options] = mockFetch.mock.calls[0];
176
+ const body = JSON.parse(options.body);
177
+ expect(body.embeds[0].title).toBe("⏱️ Job Timed Out");
178
+ expect(body.embeds[0].color).toBe(0xf59e0b); // amber
179
+ });
180
+ it("should use gray color for cancelled events", async () => {
181
+ const mockFetch = vi.fn().mockResolvedValue({
182
+ ok: true,
183
+ status: 200,
184
+ statusText: "OK",
185
+ text: () => Promise.resolve(""),
186
+ });
187
+ const runner = new DiscordHookRunner({
188
+ logger: mockLogger,
189
+ fetch: mockFetch,
190
+ });
191
+ const cancelledContext = {
192
+ ...sampleContext,
193
+ event: "cancelled",
194
+ };
195
+ const config = {
196
+ type: "discord",
197
+ channel_id: "987654321",
198
+ bot_token_env: "DISCORD_BOT_TOKEN",
199
+ };
200
+ await runner.execute(config, cancelledContext);
201
+ const [, options] = mockFetch.mock.calls[0];
202
+ const body = JSON.parse(options.body);
203
+ expect(body.embeds[0].title).toBe("🚫 Job Cancelled");
204
+ expect(body.embeds[0].color).toBe(0x6b7280); // gray
205
+ });
206
+ it("should fail if bot token env var is not set", async () => {
207
+ delete process.env.DISCORD_BOT_TOKEN;
208
+ const mockFetch = vi.fn();
209
+ const runner = new DiscordHookRunner({
210
+ logger: mockLogger,
211
+ fetch: mockFetch,
212
+ });
213
+ const config = {
214
+ type: "discord",
215
+ channel_id: "987654321",
216
+ bot_token_env: "DISCORD_BOT_TOKEN",
217
+ };
218
+ const result = await runner.execute(config, sampleContext);
219
+ expect(result.success).toBe(false);
220
+ expect(result.hookType).toBe("discord");
221
+ expect(result.error).toContain("bot token not found");
222
+ expect(result.error).toContain("DISCORD_BOT_TOKEN");
223
+ expect(mockFetch).not.toHaveBeenCalled();
224
+ expect(mockLogger.error).toHaveBeenCalled();
225
+ });
226
+ it("should use custom env var name for bot token", async () => {
227
+ process.env.MY_CUSTOM_TOKEN = "my-custom-token-value";
228
+ const mockFetch = vi.fn().mockResolvedValue({
229
+ ok: true,
230
+ status: 200,
231
+ statusText: "OK",
232
+ text: () => Promise.resolve(""),
233
+ });
234
+ const runner = new DiscordHookRunner({
235
+ logger: mockLogger,
236
+ fetch: mockFetch,
237
+ });
238
+ const config = {
239
+ type: "discord",
240
+ channel_id: "987654321",
241
+ bot_token_env: "MY_CUSTOM_TOKEN",
242
+ };
243
+ const result = await runner.execute(config, sampleContext);
244
+ expect(result.success).toBe(true);
245
+ const [, options] = mockFetch.mock.calls[0];
246
+ expect(options.headers["Authorization"]).toBe("Bot my-custom-token-value");
247
+ });
248
+ it("should handle Discord API error responses", async () => {
249
+ const mockFetch = vi.fn().mockResolvedValue({
250
+ ok: false,
251
+ status: 403,
252
+ statusText: "Forbidden",
253
+ text: () => Promise.resolve('{"message": "Missing Permissions", "code": 50013}'),
254
+ });
255
+ const runner = new DiscordHookRunner({
256
+ logger: mockLogger,
257
+ fetch: mockFetch,
258
+ });
259
+ const config = {
260
+ type: "discord",
261
+ channel_id: "987654321",
262
+ bot_token_env: "DISCORD_BOT_TOKEN",
263
+ };
264
+ const result = await runner.execute(config, sampleContext);
265
+ expect(result.success).toBe(false);
266
+ expect(result.hookType).toBe("discord");
267
+ expect(result.error).toContain("Missing Permissions");
268
+ expect(result.error).toContain("50013");
269
+ expect(mockLogger.warn).toHaveBeenCalled();
270
+ });
271
+ it("should handle invalid channel ID errors", async () => {
272
+ const mockFetch = vi.fn().mockResolvedValue({
273
+ ok: false,
274
+ status: 404,
275
+ statusText: "Not Found",
276
+ text: () => Promise.resolve('{"message": "Unknown Channel", "code": 10003}'),
277
+ });
278
+ const runner = new DiscordHookRunner({
279
+ logger: mockLogger,
280
+ fetch: mockFetch,
281
+ });
282
+ const config = {
283
+ type: "discord",
284
+ channel_id: "invalid-channel",
285
+ bot_token_env: "DISCORD_BOT_TOKEN",
286
+ };
287
+ const result = await runner.execute(config, sampleContext);
288
+ expect(result.success).toBe(false);
289
+ expect(result.error).toContain("Unknown Channel");
290
+ });
291
+ it("should handle network errors", async () => {
292
+ const mockFetch = vi.fn().mockRejectedValue(new Error("Network error: ECONNREFUSED"));
293
+ const runner = new DiscordHookRunner({
294
+ logger: mockLogger,
295
+ fetch: mockFetch,
296
+ });
297
+ const config = {
298
+ type: "discord",
299
+ channel_id: "987654321",
300
+ bot_token_env: "DISCORD_BOT_TOKEN",
301
+ };
302
+ const result = await runner.execute(config, sampleContext);
303
+ expect(result.success).toBe(false);
304
+ expect(result.error).toContain("ECONNREFUSED");
305
+ expect(mockLogger.error).toHaveBeenCalled();
306
+ });
307
+ it("should handle timeout", async () => {
308
+ // Create a mock that simulates a timeout by aborting
309
+ const mockFetch = vi.fn().mockImplementation(async (_url, options) => {
310
+ return new Promise((_, reject) => {
311
+ options.signal.addEventListener("abort", () => {
312
+ const error = new Error("The operation was aborted");
313
+ error.name = "AbortError";
314
+ reject(error);
315
+ });
316
+ });
317
+ });
318
+ const runner = new DiscordHookRunner({
319
+ logger: mockLogger,
320
+ fetch: mockFetch,
321
+ });
322
+ const config = {
323
+ type: "discord",
324
+ channel_id: "987654321",
325
+ bot_token_env: "DISCORD_BOT_TOKEN",
326
+ };
327
+ // Note: This test uses the default 10000ms timeout, but the mock
328
+ // aborts immediately when the signal fires
329
+ const result = await runner.execute(config, sampleContext);
330
+ expect(result.success).toBe(false);
331
+ expect(result.error).toContain("timed out");
332
+ expect(mockLogger.error).toHaveBeenCalled();
333
+ }, 15000); // Extend test timeout
334
+ it("should truncate long output to 1000 characters", async () => {
335
+ const mockFetch = vi.fn().mockResolvedValue({
336
+ ok: true,
337
+ status: 200,
338
+ statusText: "OK",
339
+ text: () => Promise.resolve(""),
340
+ });
341
+ const runner = new DiscordHookRunner({
342
+ logger: mockLogger,
343
+ fetch: mockFetch,
344
+ });
345
+ // Create a context with very long output
346
+ const longOutputContext = {
347
+ ...sampleContext,
348
+ result: {
349
+ success: true,
350
+ output: "A".repeat(2000), // 2000 characters
351
+ },
352
+ };
353
+ const config = {
354
+ type: "discord",
355
+ channel_id: "987654321",
356
+ bot_token_env: "DISCORD_BOT_TOKEN",
357
+ };
358
+ await runner.execute(config, longOutputContext);
359
+ const [, options] = mockFetch.mock.calls[0];
360
+ const body = JSON.parse(options.body);
361
+ const outputField = body.embeds[0].fields.find((f) => f.name === "Output");
362
+ expect(outputField).toBeDefined();
363
+ // The value includes code fence markers, so we check the truncated content
364
+ expect(outputField.value).toContain("...");
365
+ // Total should be under 1100 chars (1000 + code fences + ellipsis)
366
+ expect(outputField.value.length).toBeLessThanOrEqual(1020);
367
+ });
368
+ it("should format duration correctly for various values", async () => {
369
+ const mockFetch = vi.fn().mockResolvedValue({
370
+ ok: true,
371
+ status: 200,
372
+ statusText: "OK",
373
+ text: () => Promise.resolve(""),
374
+ });
375
+ const runner = new DiscordHookRunner({
376
+ logger: mockLogger,
377
+ fetch: mockFetch,
378
+ });
379
+ const config = {
380
+ type: "discord",
381
+ channel_id: "987654321",
382
+ bot_token_env: "DISCORD_BOT_TOKEN",
383
+ };
384
+ // Test milliseconds
385
+ let context = { ...sampleContext, job: { ...sampleContext.job, durationMs: 500 } };
386
+ await runner.execute(config, context);
387
+ let body = JSON.parse(mockFetch.mock.calls[0][1].body);
388
+ let durationField = body.embeds[0].fields.find((f) => f.name === "Duration");
389
+ expect(durationField.value).toBe("500ms");
390
+ mockFetch.mockClear();
391
+ // Test seconds
392
+ context = { ...sampleContext, job: { ...sampleContext.job, durationMs: 45000 } };
393
+ await runner.execute(config, context);
394
+ body = JSON.parse(mockFetch.mock.calls[0][1].body);
395
+ durationField = body.embeds[0].fields.find((f) => f.name === "Duration");
396
+ expect(durationField.value).toBe("45s");
397
+ mockFetch.mockClear();
398
+ // Test hours
399
+ context = { ...sampleContext, job: { ...sampleContext.job, durationMs: 3660000 } }; // 1h 1m
400
+ await runner.execute(config, context);
401
+ body = JSON.parse(mockFetch.mock.calls[0][1].body);
402
+ durationField = body.embeds[0].fields.find((f) => f.name === "Duration");
403
+ expect(durationField.value).toBe("1h 1m");
404
+ });
405
+ it("should omit schedule field if not present", async () => {
406
+ const mockFetch = vi.fn().mockResolvedValue({
407
+ ok: true,
408
+ status: 200,
409
+ statusText: "OK",
410
+ text: () => Promise.resolve(""),
411
+ });
412
+ const runner = new DiscordHookRunner({
413
+ logger: mockLogger,
414
+ fetch: mockFetch,
415
+ });
416
+ const noScheduleContext = {
417
+ ...sampleContext,
418
+ job: {
419
+ ...sampleContext.job,
420
+ scheduleName: undefined,
421
+ },
422
+ };
423
+ const config = {
424
+ type: "discord",
425
+ channel_id: "987654321",
426
+ bot_token_env: "DISCORD_BOT_TOKEN",
427
+ };
428
+ await runner.execute(config, noScheduleContext);
429
+ const [, options] = mockFetch.mock.calls[0];
430
+ const body = JSON.parse(options.body);
431
+ const scheduleField = body.embeds[0].fields.find((f) => f.name === "Schedule");
432
+ expect(scheduleField).toBeUndefined();
433
+ });
434
+ it("should use agent id if name is not provided", async () => {
435
+ const mockFetch = vi.fn().mockResolvedValue({
436
+ ok: true,
437
+ status: 200,
438
+ statusText: "OK",
439
+ text: () => Promise.resolve(""),
440
+ });
441
+ const runner = new DiscordHookRunner({
442
+ logger: mockLogger,
443
+ fetch: mockFetch,
444
+ });
445
+ const noNameContext = {
446
+ ...sampleContext,
447
+ agent: {
448
+ id: "agent-id-123",
449
+ name: undefined,
450
+ },
451
+ };
452
+ const config = {
453
+ type: "discord",
454
+ channel_id: "987654321",
455
+ bot_token_env: "DISCORD_BOT_TOKEN",
456
+ };
457
+ await runner.execute(config, noNameContext);
458
+ const [, options] = mockFetch.mock.calls[0];
459
+ const body = JSON.parse(options.body);
460
+ const agentField = body.embeds[0].fields.find((f) => f.name === "Agent");
461
+ expect(agentField.value).toBe("agent-id-123");
462
+ });
463
+ it("should measure execution duration", async () => {
464
+ const mockFetch = vi.fn().mockImplementation(async () => {
465
+ // Add a small delay to measure
466
+ await new Promise((resolve) => setTimeout(resolve, 50));
467
+ return {
468
+ ok: true,
469
+ status: 200,
470
+ statusText: "OK",
471
+ text: () => Promise.resolve(""),
472
+ };
473
+ });
474
+ const runner = new DiscordHookRunner({
475
+ logger: mockLogger,
476
+ fetch: mockFetch,
477
+ });
478
+ const config = {
479
+ type: "discord",
480
+ channel_id: "987654321",
481
+ bot_token_env: "DISCORD_BOT_TOKEN",
482
+ };
483
+ const result = await runner.execute(config, sampleContext);
484
+ expect(result.success).toBe(true);
485
+ expect(result.durationMs).toBeGreaterThanOrEqual(40); // Allow some tolerance
486
+ expect(result.durationMs).toBeLessThan(5000);
487
+ });
488
+ it("should work without a logger", async () => {
489
+ const mockFetch = vi.fn().mockResolvedValue({
490
+ ok: true,
491
+ status: 200,
492
+ statusText: "OK",
493
+ text: () => Promise.resolve("no logger"),
494
+ });
495
+ const runner = new DiscordHookRunner({ fetch: mockFetch }); // No logger
496
+ const config = {
497
+ type: "discord",
498
+ channel_id: "987654321",
499
+ bot_token_env: "DISCORD_BOT_TOKEN",
500
+ };
501
+ const result = await runner.execute(config, sampleContext);
502
+ expect(result.success).toBe(true);
503
+ expect(result.output).toBe("no logger");
504
+ });
505
+ it("should handle response body read errors gracefully", async () => {
506
+ const mockFetch = vi.fn().mockResolvedValue({
507
+ ok: true,
508
+ status: 200,
509
+ statusText: "OK",
510
+ text: () => Promise.reject(new Error("Body read error")),
511
+ });
512
+ const runner = new DiscordHookRunner({
513
+ logger: mockLogger,
514
+ fetch: mockFetch,
515
+ });
516
+ const config = {
517
+ type: "discord",
518
+ channel_id: "987654321",
519
+ bot_token_env: "DISCORD_BOT_TOKEN",
520
+ };
521
+ const result = await runner.execute(config, sampleContext);
522
+ expect(result.success).toBe(true);
523
+ expect(result.output).toBeUndefined();
524
+ });
525
+ it("should handle non-JSON error responses gracefully", async () => {
526
+ const mockFetch = vi.fn().mockResolvedValue({
527
+ ok: false,
528
+ status: 500,
529
+ statusText: "Internal Server Error",
530
+ text: () => Promise.resolve("Something went wrong"),
531
+ });
532
+ const runner = new DiscordHookRunner({
533
+ logger: mockLogger,
534
+ fetch: mockFetch,
535
+ });
536
+ const config = {
537
+ type: "discord",
538
+ channel_id: "987654321",
539
+ bot_token_env: "DISCORD_BOT_TOKEN",
540
+ };
541
+ const result = await runner.execute(config, sampleContext);
542
+ expect(result.success).toBe(false);
543
+ expect(result.error).toContain("HTTP 500");
544
+ expect(result.error).toContain("Something went wrong");
545
+ });
546
+ it("should not include output field if output is empty", async () => {
547
+ const mockFetch = vi.fn().mockResolvedValue({
548
+ ok: true,
549
+ status: 200,
550
+ statusText: "OK",
551
+ text: () => Promise.resolve(""),
552
+ });
553
+ const runner = new DiscordHookRunner({
554
+ logger: mockLogger,
555
+ fetch: mockFetch,
556
+ });
557
+ const emptyOutputContext = {
558
+ ...sampleContext,
559
+ result: {
560
+ success: true,
561
+ output: "", // Empty output
562
+ },
563
+ };
564
+ const config = {
565
+ type: "discord",
566
+ channel_id: "987654321",
567
+ bot_token_env: "DISCORD_BOT_TOKEN",
568
+ };
569
+ await runner.execute(config, emptyOutputContext);
570
+ const [, options] = mockFetch.mock.calls[0];
571
+ const body = JSON.parse(options.body);
572
+ const outputField = body.embeds[0].fields.find((f) => f.name === "Output");
573
+ expect(outputField).toBeUndefined();
574
+ });
575
+ it("should not include output field if output is whitespace only", async () => {
576
+ const mockFetch = vi.fn().mockResolvedValue({
577
+ ok: true,
578
+ status: 200,
579
+ statusText: "OK",
580
+ text: () => Promise.resolve(""),
581
+ });
582
+ const runner = new DiscordHookRunner({
583
+ logger: mockLogger,
584
+ fetch: mockFetch,
585
+ });
586
+ const whitespaceOutputContext = {
587
+ ...sampleContext,
588
+ result: {
589
+ success: true,
590
+ output: " \n\t ", // Whitespace only
591
+ },
592
+ };
593
+ const config = {
594
+ type: "discord",
595
+ channel_id: "987654321",
596
+ bot_token_env: "DISCORD_BOT_TOKEN",
597
+ };
598
+ await runner.execute(config, whitespaceOutputContext);
599
+ const [, options] = mockFetch.mock.calls[0];
600
+ const body = JSON.parse(options.body);
601
+ const outputField = body.embeds[0].fields.find((f) => f.name === "Output");
602
+ expect(outputField).toBeUndefined();
603
+ });
604
+ });
605
+ });
606
+ //# sourceMappingURL=discord-runner.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discord-runner.test.js","sourceRoot":"","sources":["../../../src/hooks/__tests__/discord-runner.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for HookExecutor
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=hook-executor.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-executor.test.d.ts","sourceRoot":"","sources":["../../../src/hooks/__tests__/hook-executor.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}