@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,443 @@
1
+ /**
2
+ * Tests for HookExecutor
3
+ */
4
+ import { describe, it, expect, vi, beforeEach } from "vitest";
5
+ import { HookExecutor } from "../hook-executor.js";
6
+ describe("HookExecutor", () => {
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
+ beforeEach(() => {
35
+ vi.clearAllMocks();
36
+ });
37
+ describe("executeHooks", () => {
38
+ it("should return success when no hooks are configured", async () => {
39
+ const executor = new HookExecutor({ logger: mockLogger });
40
+ const result = await executor.executeHooks(undefined, sampleContext, "after_run");
41
+ expect(result.success).toBe(true);
42
+ expect(result.totalHooks).toBe(0);
43
+ expect(result.successfulHooks).toBe(0);
44
+ expect(result.failedHooks).toBe(0);
45
+ });
46
+ it("should return success when hook list is empty", async () => {
47
+ const executor = new HookExecutor({ logger: mockLogger });
48
+ const hooksConfig = {
49
+ after_run: [],
50
+ };
51
+ const result = await executor.executeHooks(hooksConfig, sampleContext, "after_run");
52
+ expect(result.success).toBe(true);
53
+ expect(result.totalHooks).toBe(0);
54
+ });
55
+ it("should execute shell hooks successfully", async () => {
56
+ const executor = new HookExecutor({ logger: mockLogger });
57
+ const hooksConfig = {
58
+ after_run: [
59
+ {
60
+ type: "shell",
61
+ command: "echo 'hook executed'",
62
+ },
63
+ ],
64
+ };
65
+ const result = await executor.executeHooks(hooksConfig, sampleContext, "after_run");
66
+ expect(result.success).toBe(true);
67
+ expect(result.totalHooks).toBe(1);
68
+ expect(result.successfulHooks).toBe(1);
69
+ expect(result.failedHooks).toBe(0);
70
+ expect(result.results).toHaveLength(1);
71
+ expect(result.results[0].success).toBe(true);
72
+ expect(result.results[0].hookType).toBe("shell");
73
+ });
74
+ it("should execute multiple hooks sequentially", async () => {
75
+ const executor = new HookExecutor({ logger: mockLogger });
76
+ const hooksConfig = {
77
+ after_run: [
78
+ { type: "shell", command: "echo 'first'" },
79
+ { type: "shell", command: "echo 'second'" },
80
+ { type: "shell", command: "echo 'third'" },
81
+ ],
82
+ };
83
+ const result = await executor.executeHooks(hooksConfig, sampleContext, "after_run");
84
+ expect(result.success).toBe(true);
85
+ expect(result.totalHooks).toBe(3);
86
+ expect(result.successfulHooks).toBe(3);
87
+ expect(result.results).toHaveLength(3);
88
+ });
89
+ it("should handle hook failures with continue_on_error=true (default)", async () => {
90
+ const executor = new HookExecutor({ logger: mockLogger });
91
+ const hooksConfig = {
92
+ after_run: [
93
+ { type: "shell", command: "echo 'first'" },
94
+ { type: "shell", command: "exit 1" }, // This will fail
95
+ { type: "shell", command: "echo 'third'" }, // Should still run
96
+ ],
97
+ };
98
+ const result = await executor.executeHooks(hooksConfig, sampleContext, "after_run");
99
+ expect(result.success).toBe(false); // Overall success is false
100
+ expect(result.totalHooks).toBe(3);
101
+ expect(result.successfulHooks).toBe(2);
102
+ expect(result.failedHooks).toBe(1);
103
+ expect(result.shouldFailJob).toBe(false); // continue_on_error is true by default
104
+ expect(result.results).toHaveLength(3); // All hooks ran
105
+ });
106
+ it("should set shouldFailJob=true when continue_on_error=false", async () => {
107
+ const executor = new HookExecutor({ logger: mockLogger });
108
+ const hooksConfig = {
109
+ after_run: [
110
+ {
111
+ type: "shell",
112
+ command: "exit 1",
113
+ continue_on_error: false,
114
+ },
115
+ ],
116
+ };
117
+ const result = await executor.executeHooks(hooksConfig, sampleContext, "after_run");
118
+ expect(result.success).toBe(false);
119
+ expect(result.shouldFailJob).toBe(true);
120
+ expect(mockLogger.error).toHaveBeenCalled();
121
+ });
122
+ it("should filter hooks by on_events", async () => {
123
+ const executor = new HookExecutor({ logger: mockLogger });
124
+ const hooksConfig = {
125
+ after_run: [
126
+ {
127
+ type: "shell",
128
+ command: "echo 'should run'",
129
+ on_events: ["completed"],
130
+ },
131
+ {
132
+ type: "shell",
133
+ command: "echo 'should skip'",
134
+ on_events: ["failed"], // This won't match 'completed' event
135
+ },
136
+ ],
137
+ };
138
+ const result = await executor.executeHooks(hooksConfig, sampleContext, "after_run");
139
+ expect(result.success).toBe(true);
140
+ expect(result.totalHooks).toBe(2);
141
+ expect(result.successfulHooks).toBe(1);
142
+ expect(result.skippedHooks).toBe(1);
143
+ expect(result.results).toHaveLength(1); // Only the one that ran
144
+ });
145
+ it("should run hooks without on_events filter for all events", async () => {
146
+ const executor = new HookExecutor({ logger: mockLogger });
147
+ const hooksConfig = {
148
+ after_run: [
149
+ {
150
+ type: "shell",
151
+ command: "echo 'always runs'",
152
+ // No on_events specified
153
+ },
154
+ ],
155
+ };
156
+ const result = await executor.executeHooks(hooksConfig, sampleContext, "after_run");
157
+ expect(result.success).toBe(true);
158
+ expect(result.successfulHooks).toBe(1);
159
+ expect(result.skippedHooks).toBe(0);
160
+ });
161
+ it("should execute on_error hooks for failed events", async () => {
162
+ const executor = new HookExecutor({ logger: mockLogger });
163
+ const failedContext = {
164
+ ...sampleContext,
165
+ event: "failed",
166
+ result: {
167
+ success: false,
168
+ output: "Job failed",
169
+ error: "Something went wrong",
170
+ },
171
+ };
172
+ const hooksConfig = {
173
+ on_error: [
174
+ {
175
+ type: "shell",
176
+ command: "echo 'error handler'",
177
+ },
178
+ ],
179
+ };
180
+ const result = await executor.executeHooks(hooksConfig, failedContext, "on_error");
181
+ expect(result.success).toBe(true);
182
+ expect(result.successfulHooks).toBe(1);
183
+ });
184
+ it("should handle timeout event type", async () => {
185
+ const executor = new HookExecutor({ logger: mockLogger });
186
+ const timeoutContext = {
187
+ ...sampleContext,
188
+ event: "timeout",
189
+ result: {
190
+ success: false,
191
+ output: "",
192
+ error: "Job timed out",
193
+ },
194
+ };
195
+ const hooksConfig = {
196
+ after_run: [
197
+ {
198
+ type: "shell",
199
+ command: "echo 'timeout handler'",
200
+ on_events: ["timeout"],
201
+ },
202
+ ],
203
+ };
204
+ const result = await executor.executeHooks(hooksConfig, timeoutContext, "after_run");
205
+ expect(result.success).toBe(true);
206
+ expect(result.successfulHooks).toBe(1);
207
+ });
208
+ it("should handle cancelled event type", async () => {
209
+ const executor = new HookExecutor({ logger: mockLogger });
210
+ const cancelledContext = {
211
+ ...sampleContext,
212
+ event: "cancelled",
213
+ result: {
214
+ success: false,
215
+ output: "",
216
+ error: "Job was cancelled",
217
+ },
218
+ };
219
+ const hooksConfig = {
220
+ after_run: [
221
+ {
222
+ type: "shell",
223
+ command: "echo 'cancelled handler'",
224
+ on_events: ["cancelled"],
225
+ },
226
+ ],
227
+ };
228
+ const result = await executor.executeHooks(hooksConfig, cancelledContext, "after_run");
229
+ expect(result.success).toBe(true);
230
+ expect(result.successfulHooks).toBe(1);
231
+ });
232
+ it("should execute webhook hooks", async () => {
233
+ const executor = new HookExecutor({ logger: mockLogger });
234
+ const hooksConfig = {
235
+ after_run: [
236
+ {
237
+ type: "webhook",
238
+ url: "https://example.com/hook",
239
+ },
240
+ ],
241
+ };
242
+ const result = await executor.executeHooks(hooksConfig, sampleContext, "after_run");
243
+ // Webhook hooks are now implemented - they will fail against example.com
244
+ // but the key thing is they're not returning "not yet implemented"
245
+ expect(result.results[0].hookType).toBe("webhook");
246
+ expect(result.results[0].error).not.toContain("not yet implemented");
247
+ });
248
+ it("should execute discord hooks (fails with missing token)", async () => {
249
+ const executor = new HookExecutor({ logger: mockLogger });
250
+ const hooksConfig = {
251
+ after_run: [
252
+ {
253
+ type: "discord",
254
+ channel_id: "123456789",
255
+ bot_token_env: "DISCORD_TOKEN",
256
+ },
257
+ ],
258
+ };
259
+ const result = await executor.executeHooks(hooksConfig, sampleContext, "after_run");
260
+ // Discord hooks are now implemented - they will fail without the token
261
+ // but the key thing is they're not returning "not yet implemented"
262
+ expect(result.results[0].hookType).toBe("discord");
263
+ expect(result.results[0].error).not.toContain("not yet implemented");
264
+ // Should fail because DISCORD_TOKEN env var is not set
265
+ expect(result.results[0].error).toContain("bot token not found");
266
+ });
267
+ it("should calculate total duration", async () => {
268
+ const executor = new HookExecutor({ logger: mockLogger });
269
+ const hooksConfig = {
270
+ after_run: [
271
+ { type: "shell", command: "sleep 0.1" },
272
+ { type: "shell", command: "sleep 0.1" },
273
+ ],
274
+ };
275
+ const result = await executor.executeHooks(hooksConfig, sampleContext, "after_run");
276
+ expect(result.totalDurationMs).toBeGreaterThanOrEqual(150); // At least 200ms combined
277
+ });
278
+ });
279
+ // =============================================================================
280
+ // US5: Error-Specific Hooks
281
+ // Tests that on_error hooks only run when job fails, while after_run hooks
282
+ // run regardless of success/failure (can filter with on_events)
283
+ // =============================================================================
284
+ describe("US5: Error-Specific Hooks", () => {
285
+ it("should NOT execute on_error hooks for completed (success) events", async () => {
286
+ const executor = new HookExecutor({ logger: mockLogger });
287
+ const hooksConfig = {
288
+ on_error: [
289
+ {
290
+ type: "shell",
291
+ command: "echo 'error handler should not run'",
292
+ },
293
+ ],
294
+ };
295
+ // Context is for a completed/success event
296
+ const result = await executor.executeHooks(hooksConfig, sampleContext, "on_error");
297
+ // on_error hooks should still execute if called directly (the filtering
298
+ // happens in ScheduleExecutor which only calls on_error for failed events)
299
+ // However, with on_events filtering, we can test the filter itself
300
+ expect(result.totalHooks).toBe(1);
301
+ });
302
+ it("should execute after_run hooks for completed events", async () => {
303
+ const executor = new HookExecutor({ logger: mockLogger });
304
+ const hooksConfig = {
305
+ after_run: [
306
+ {
307
+ type: "shell",
308
+ command: "echo 'after_run for success'",
309
+ },
310
+ ],
311
+ };
312
+ const result = await executor.executeHooks(hooksConfig, sampleContext, "after_run");
313
+ expect(result.success).toBe(true);
314
+ expect(result.successfulHooks).toBe(1);
315
+ });
316
+ it("should execute after_run hooks for failed events", async () => {
317
+ const executor = new HookExecutor({ logger: mockLogger });
318
+ const failedContext = {
319
+ ...sampleContext,
320
+ event: "failed",
321
+ result: {
322
+ success: false,
323
+ output: "Job failed",
324
+ error: "Something went wrong",
325
+ },
326
+ };
327
+ const hooksConfig = {
328
+ after_run: [
329
+ {
330
+ type: "shell",
331
+ command: "echo 'after_run for failure'",
332
+ },
333
+ ],
334
+ };
335
+ const result = await executor.executeHooks(hooksConfig, failedContext, "after_run");
336
+ expect(result.success).toBe(true);
337
+ expect(result.successfulHooks).toBe(1);
338
+ });
339
+ it("should allow after_run hooks to filter with on_events for error escalation", async () => {
340
+ const executor = new HookExecutor({ logger: mockLogger });
341
+ const failedContext = {
342
+ ...sampleContext,
343
+ event: "failed",
344
+ result: {
345
+ success: false,
346
+ output: "Job failed",
347
+ error: "Critical failure",
348
+ },
349
+ };
350
+ const hooksConfig = {
351
+ after_run: [
352
+ {
353
+ // This hook sends routine completions to general channel - should NOT run
354
+ type: "shell",
355
+ command: "echo 'general notification'",
356
+ on_events: ["completed"],
357
+ },
358
+ {
359
+ // This hook runs for all events
360
+ type: "shell",
361
+ command: "echo 'always runs'",
362
+ },
363
+ ],
364
+ };
365
+ const result = await executor.executeHooks(hooksConfig, failedContext, "after_run");
366
+ expect(result.success).toBe(true);
367
+ expect(result.totalHooks).toBe(2);
368
+ expect(result.successfulHooks).toBe(1); // Only the unfiltered one ran
369
+ expect(result.skippedHooks).toBe(1); // The completed-only hook was skipped
370
+ });
371
+ it("should support separate on_error hooks for escalation while after_run logs all", async () => {
372
+ const executor = new HookExecutor({ logger: mockLogger });
373
+ const failedContext = {
374
+ ...sampleContext,
375
+ event: "failed",
376
+ result: {
377
+ success: false,
378
+ output: "Job failed",
379
+ error: "Critical failure",
380
+ },
381
+ };
382
+ // Config with both after_run (general logging) and on_error (escalation)
383
+ const hooksConfig = {
384
+ after_run: [
385
+ {
386
+ // General channel notification for all events
387
+ type: "shell",
388
+ command: "echo 'logged to general channel'",
389
+ },
390
+ ],
391
+ on_error: [
392
+ {
393
+ // Escalation to on-call for failures only
394
+ type: "shell",
395
+ command: "echo 'escalated to on-call'",
396
+ },
397
+ ],
398
+ };
399
+ // Execute after_run hooks
400
+ const afterRunResult = await executor.executeHooks(hooksConfig, failedContext, "after_run");
401
+ expect(afterRunResult.success).toBe(true);
402
+ expect(afterRunResult.successfulHooks).toBe(1);
403
+ // Execute on_error hooks
404
+ const onErrorResult = await executor.executeHooks(hooksConfig, failedContext, "on_error");
405
+ expect(onErrorResult.success).toBe(true);
406
+ expect(onErrorResult.successfulHooks).toBe(1);
407
+ });
408
+ it("should NOT run on_error hooks for timeout events (only failed)", async () => {
409
+ const executor = new HookExecutor({ logger: mockLogger });
410
+ const timeoutContext = {
411
+ ...sampleContext,
412
+ event: "timeout",
413
+ result: {
414
+ success: false,
415
+ output: "",
416
+ error: "Job timed out",
417
+ },
418
+ };
419
+ const hooksConfig = {
420
+ on_error: [
421
+ {
422
+ type: "shell",
423
+ command: "echo 'on_error should not run for timeout'",
424
+ on_events: ["failed"], // Explicitly only for failed
425
+ },
426
+ ],
427
+ after_run: [
428
+ {
429
+ type: "shell",
430
+ command: "echo 'after_run runs for timeout'",
431
+ },
432
+ ],
433
+ };
434
+ // on_error with failed filter should skip timeout
435
+ const onErrorResult = await executor.executeHooks(hooksConfig, timeoutContext, "on_error");
436
+ expect(onErrorResult.skippedHooks).toBe(1);
437
+ // after_run should still run
438
+ const afterRunResult = await executor.executeHooks(hooksConfig, timeoutContext, "after_run");
439
+ expect(afterRunResult.successfulHooks).toBe(1);
440
+ });
441
+ });
442
+ });
443
+ //# sourceMappingURL=hook-executor.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-executor.test.js","sourceRoot":"","sources":["../../../src/hooks/__tests__/hook-executor.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for ShellHookRunner
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=shell-runner.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell-runner.test.d.ts","sourceRoot":"","sources":["../../../src/hooks/__tests__/shell-runner.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}