@workflow/cli 5.0.0-beta.47 → 5.0.0-beta.48

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 (49) hide show
  1. package/dist/commands/cancel.d.ts +10 -1
  2. package/dist/commands/cancel.d.ts.map +1 -1
  3. package/dist/commands/cancel.js +20 -7
  4. package/dist/commands/inspect-flag-forwarding.test.d.ts +2 -0
  5. package/dist/commands/inspect-flag-forwarding.test.d.ts.map +1 -0
  6. package/dist/commands/inspect-flag-forwarding.test.js +121 -0
  7. package/dist/commands/inspect-flag-scope.test.d.ts +2 -0
  8. package/dist/commands/inspect-flag-scope.test.d.ts.map +1 -0
  9. package/dist/commands/inspect-flag-scope.test.js +161 -0
  10. package/dist/commands/inspect.d.ts +13 -1
  11. package/dist/commands/inspect.d.ts.map +1 -1
  12. package/dist/commands/inspect.js +70 -10
  13. package/dist/commands/start.d.ts +1 -1
  14. package/dist/commands/web.d.ts +1 -1
  15. package/dist/lib/bulk-cancel.d.ts +15 -2
  16. package/dist/lib/bulk-cancel.d.ts.map +1 -1
  17. package/dist/lib/bulk-cancel.js +49 -18
  18. package/dist/lib/bulk-cancel.test.js +80 -8
  19. package/dist/lib/config/types.d.ts +6 -1
  20. package/dist/lib/config/types.d.ts.map +1 -1
  21. package/dist/lib/config/types.js +1 -1
  22. package/dist/lib/inspect/attribute-filter.d.ts +15 -0
  23. package/dist/lib/inspect/attribute-filter.d.ts.map +1 -0
  24. package/dist/lib/inspect/attribute-filter.js +51 -0
  25. package/dist/lib/inspect/attribute-filter.test.d.ts +2 -0
  26. package/dist/lib/inspect/attribute-filter.test.d.ts.map +1 -0
  27. package/dist/lib/inspect/attribute-filter.test.js +65 -0
  28. package/dist/lib/inspect/errors.d.ts +28 -0
  29. package/dist/lib/inspect/errors.d.ts.map +1 -1
  30. package/dist/lib/inspect/errors.js +59 -1
  31. package/dist/lib/inspect/errors.test.d.ts +2 -0
  32. package/dist/lib/inspect/errors.test.d.ts.map +1 -0
  33. package/dist/lib/inspect/errors.test.js +48 -0
  34. package/dist/lib/inspect/flag-bounds.d.ts +57 -0
  35. package/dist/lib/inspect/flag-bounds.d.ts.map +1 -0
  36. package/dist/lib/inspect/flag-bounds.js +112 -0
  37. package/dist/lib/inspect/flag-bounds.test.d.ts +2 -0
  38. package/dist/lib/inspect/flag-bounds.test.d.ts.map +1 -0
  39. package/dist/lib/inspect/flag-bounds.test.js +126 -0
  40. package/dist/lib/inspect/flags.d.ts +1 -1
  41. package/dist/lib/inspect/flags.d.ts.map +1 -1
  42. package/dist/lib/inspect/flags.js +5 -2
  43. package/dist/lib/inspect/hydration.d.ts.map +1 -1
  44. package/dist/lib/inspect/hydration.js +2 -1
  45. package/dist/lib/inspect/output.d.ts +10 -0
  46. package/dist/lib/inspect/output.d.ts.map +1 -1
  47. package/dist/lib/inspect/output.js +138 -24
  48. package/dist/lib/inspect/output.test.js +223 -2
  49. package/package.json +13 -13
@@ -23,8 +23,24 @@ function makeLogger() {
23
23
  */
24
24
  function makeWorld(opts) {
25
25
  const runsById = new Map(opts.runs.map((r) => [r.runId, r]));
26
+ const windowStart = opts.analyticsWindowStart;
27
+ const analyticsList = windowStart
28
+ ? vi.fn(async (params = {}) => ({
29
+ data: params.status
30
+ ? opts.runs.filter((r) => r.status === params.status)
31
+ : opts.runs,
32
+ hasMore: opts.hasMore ?? false,
33
+ pageInfo: {
34
+ currentLookbackDays: 30,
35
+ maxLookbackDays: 30,
36
+ currentWindowStart: new Date(windowStart),
37
+ maxWindowStart: new Date(windowStart),
38
+ upgradeAvailable: false,
39
+ },
40
+ }))
41
+ : undefined;
26
42
  const world = {
27
- analytics: undefined,
43
+ analytics: analyticsList ? { runs: { list: analyticsList } } : undefined,
28
44
  runs: {
29
45
  // Status-aware so tests can seed mixed-status runs and assert that only
30
46
  // the requested status is matched. performBulkCancel always passes a
@@ -52,16 +68,24 @@ function makeWorld(opts) {
52
68
  return world;
53
69
  }
54
70
  describe('validateBulkCancelLimit', () => {
55
- it('accepts integers within [1, 500]', () => {
71
+ it('accepts integers within [1, 100]', () => {
56
72
  expect(validateBulkCancelLimit(1)).toBeUndefined();
57
73
  expect(validateBulkCancelLimit(50)).toBeUndefined();
58
- expect(validateBulkCancelLimit(500)).toBeUndefined();
74
+ expect(validateBulkCancelLimit(100)).toBeUndefined();
59
75
  });
60
76
  it('rejects out-of-range and non-integer values', () => {
61
- expect(validateBulkCancelLimit(0)).toMatch(/between 1 and 500/);
62
- expect(validateBulkCancelLimit(501)).toMatch(/between 1 and 500/);
63
- expect(validateBulkCancelLimit(-5)).toMatch(/between 1 and 500/);
64
- expect(validateBulkCancelLimit(1.5)).toMatch(/between 1 and 500/);
77
+ expect(validateBulkCancelLimit(0)).toMatch(/between 1 and 100/);
78
+ expect(validateBulkCancelLimit(101)).toMatch(/between 1 and 100/);
79
+ expect(validateBulkCancelLimit(-5)).toMatch(/between 1 and 100/);
80
+ expect(validateBulkCancelLimit(1.5)).toMatch(/between 1 and 100/);
81
+ });
82
+ // 101-500 was advertised and accepted here, and then rejected by whichever
83
+ // path served it: the analytics runs listing rejects it locally, and the
84
+ // storage listing it falls back to caps at 100 server-side. Neither message
85
+ // reached the user, because cancel's catch printed nothing for either.
86
+ it('rejects the range no backend ever served', () => {
87
+ expect(validateBulkCancelLimit(200)).toBeDefined();
88
+ expect(validateBulkCancelLimit(500)).toBeDefined();
65
89
  });
66
90
  });
67
91
  describe('formatBulkCancelSummary', () => {
@@ -363,4 +387,52 @@ describe('performBulkCancel', () => {
363
387
  expect(cancelMany).not.toHaveBeenCalled();
364
388
  });
365
389
  });
366
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVsay1jYW5jZWwudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvYnVsay1jYW5jZWwudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ2xELE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsaUJBQWlCLEVBQ2pCLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsaUJBQWlCLEVBQ2pCLHVCQUF1QixHQUN4QixNQUFNLGtCQUFrQixDQUFDO0FBUzFCLDBFQUEwRTtBQUMxRSxTQUFTLFVBQVU7SUFDakIsTUFBTSxJQUFJLEdBQWEsRUFBRSxDQUFDO0lBQzFCLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztJQUMzQixNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7SUFDNUIsT0FBTztRQUNMLE1BQU0sRUFBRTtZQUNOLEdBQUcsRUFBRSxDQUFDLENBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDaEMsSUFBSSxFQUFFLENBQUMsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNsQyxLQUFLLEVBQUUsQ0FBQyxDQUFTLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ3JDO1FBQ0QsSUFBSTtRQUNKLEtBQUs7UUFDTCxNQUFNO0tBQ1AsQ0FBQztBQUNKLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxTQUFTLENBQUMsSUFPbEI7SUFDQyxNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMs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QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtcbiAgQnVsa0NhbmNlbFdvcmtmbG93UnVuc1JlcXVlc3QsXG4gIEJ1bGtDYW5jZWxXb3JrZmxvd1J1bnNSZXN1bHQsXG4gIFdvcmxkLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQsIHZpIH0gZnJvbSAndml0ZXN0JztcbmltcG9ydCB7XG4gIGJ1bGtDYW5jZWxGYWlsdXJlTGluZXMsXG4gIENMSV9DQU5DRUxfUkVBU09OLFxuICBmb3JtYXRCdWxrQ2FuY2VsU3VtbWFyeSxcbiAgSEFTX01PUkVfR1VJREFOQ0UsXG4gIHBlcmZvcm1CdWxrQ2FuY2VsLFxuICB2YWxpZGF0ZUJ1bGtDYW5jZWxMaW1pdCxcbn0gZnJvbSAnLi9idWxrLWNhbmNlbC5qcyc7XG5cbmludGVyZmFjZSBGYWtlUnVuIHtcbiAgcnVuSWQ6IHN0cmluZztcbiAgd29ya2Zsb3dOYW1lOiBzdHJpbmc7XG4gIHN0YXR1czogc3RyaW5nO1xuICBzdGFydGVkQXQ/OiBzdHJpbmc7XG59XG5cbi8qKiBDb2xsZWN0cyBsb2dnZXIgb3V0cHV0IHNvIGFzc2VydGlvbnMgY2FuIGluc3BlY3Qgd2hhdCB0aGUgdXNlciBzYXcuICovXG5mdW5jdGlvbiBtYWtlTG9nZ2VyKCkge1xuICBjb25zdCBsb2dzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCB3YXJuczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICByZXR1cm4ge1xuICAgIGxvZ2dlcjoge1xuICAgICAgbG9nOiAobTogc3RyaW5nKSA9PiBsb2dzLnB1c2gobSksXG4gICAgICB3YXJuOiAobTogc3RyaW5nKSA9PiB3YXJucy5wdXNoKG0pLFxuICAgICAgZXJyb3I6IChtOiBzdHJpbmcpID0+IGVycm9ycy5wdXNoKG0pLFxuICAgIH0sXG4gICAgbG9ncyxcbiAgICB3YXJucyxcbiAgICBlcnJvcnMsXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGQgYSBtaW5pbWFsIGZha2Ugd29ybGQuIGBjYW5jZWxNYW55YCBpcyBhdHRhY2hlZCBvbmx5IHdoZW4gcHJvdmlkZWQsXG4gKiB3aGljaCBpcyBob3cge0BsaW5rIHBlcmZvcm1CdWxrQ2FuY2VsfSAodmlhIGBjYW5jZWxSdW5zYCkgZGVjaWRlcyBiZXR3ZWVuXG4gKiB0aGUgc2luZ2xlLXJlcXVlc3QgZmFzdCBwYXRoIGFuZCB0aGUgcGVyLXJ1biBmYWxsYmFjay5cbiAqL1xuZnVuY3Rpb24gbWFrZVdvcmxkKG9wdHM6IHtcbiAgcnVuczogRmFrZVJ1bltdO1xuICBoYXNNb3JlPzogYm9vbGVhbjtcbiAgY2FuY2VsTWFueT86IChcbiAgICByZXF1ZXN0OiBCdWxrQ2FuY2VsV29ya2Zsb3dSdW5zUmVxdWVzdFxuICApID0+IFByb21pc2U8QnVsa0NhbmNlbFdvcmtmbG93UnVuc1Jlc3VsdD47XG4gIGV2ZW50c0NyZWF0ZT86IChydW5JZDogc3RyaW5nKSA9PiBQcm9taXNlPHVua25vd24+O1xufSk6IFdvcmxkIHtcbiAgY29uc3QgcnVuc0J5SWQgPSBuZXcgTWFwKG9wdHMucnVucy5tYXAoKHIpID0+IFtyLnJ1bklkLCByXSkpO1xuICBjb25zdCB3b3JsZDogYW55ID0ge1xuICAgIGFuYWx5dGljczogdW5kZWZpbmVkLFxuICAgIHJ1bnM6IHtcbiAgICAgIC8vIFN0YXR1cy1hd2FyZSBzbyB0ZXN0cyBjYW4gc2VlZCBtaXhlZC1zdGF0dXMgcnVucyBhbmQgYXNzZXJ0IHRoYXQgb25seVxuICAgICAgLy8gdGhlIHJlcXVlc3RlZCBzdGF0dXMgaXMgbWF0Y2hlZC4gcGVyZm9ybUJ1bGtDYW5jZWwgYWx3YXlzIHBhc3NlcyBhXG4gICAgICAvLyBjb25jcmV0ZSBzdGF0dXMgcGVyIGNhbGwgKHRoZSBwaW5uZWQgb25lLCBvciBlYWNoIGNhbmNlbGxhYmxlIHN0YXR1cykuXG4gICAgICBsaXN0OiB2aS5mbihhc3luYyAocGFyYW1zOiB7IHN0YXR1cz86IHN0cmluZyB9ID0ge30pID0+ICh7XG4gICAgICAgIGRhdGE6IHBhcmFtcy5zdGF0dXNcbiAgICAgICAgICA/IG9wdHMucnVucy5maWx0ZXIoKHIpID0+IHIuc3RhdHVzID09PSBwYXJhbXMuc3RhdHVzKVxuICAgICAgICAgIDogb3B0cy5ydW5zLFxuICAgICAgICBoYXNNb3JlOiBvcHRzLmhhc01vcmUgPz8gZmFsc2UsXG4gICAgICB9KSksXG4gICAgICBnZXQ6IHZpLmZuKGFzeW5jIChydW5JZDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1biA9IHJ1bnNCeUlkLmdldChydW5JZCk7XG4gICAgICAgIGlmICghcnVuKSB0aHJvdyBuZXcgRXJyb3IoYHJ1biAke3J1bklkfSBub3QgZm91bmRgKTtcbiAgICAgICAgcmV0dXJuIHJ1bjtcbiAgICAgIH0pLFxuICAgIH0sXG4gICAgZXZlbnRzOiB7XG4gICAgICBjcmVhdGU6IHZpLmZuKGFzeW5jIChydW5JZDogc3RyaW5nKSA9PiBvcHRzLmV2ZW50c0NyZWF0ZT8uKHJ1bklkKSksXG4gICAgfSxcbiAgfTtcbiAgaWYgKG9wdHMuY2FuY2VsTWFueSkge1xuICAgIHdvcmxkLnJ1bnMuY2FuY2VsTWFueSA9IHZpLmZuKG9wdHMuY2FuY2VsTWFueSk7XG4gIH1cbiAgcmV0dXJuIHdvcmxkIGFzIFdvcmxkO1xufVxuXG5kZXNjcmliZSgndmFsaWRhdGVCdWxrQ2FuY2VsTGltaXQnLCAoKSA9PiB7XG4gIGl0KCdhY2NlcHRzIGludGVnZXJzIHdpdGhpbiBbMSwgNTAwXScsICgpID0+IHtcbiAgICBleHBlY3QodmFsaWRhdGVCdWxrQ2FuY2VsTGltaXQoMSkpLnRvQmVVbmRlZmluZWQoKTtcbiAgICBleHBlY3QodmFsaWRhdGVCdWxrQ2FuY2VsTGltaXQoNTApKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgZXhwZWN0KHZhbGlkYXRlQnVsa0NhbmNlbExpbWl0KDUwMCkpLnRvQmVVbmRlZmluZWQoKTtcbiAgfSk7XG5cbiAgaXQoJ3JlamVjdHMgb3V0LW9mLXJhbmdlIGFuZCBub24taW50ZWdlciB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHZhbGlkYXRlQnVsa0NhbmNlbExpbWl0KDApKS50b01hdGNoKC9iZXR3ZWVuIDEgYW5kIDUwMC8pO1xuICAgIGV4cGVjdCh2YWxpZGF0ZUJ1bGtDYW5jZWxMaW1pdCg1MDEpKS50b01hdGNoKC9iZXR3ZWVuIDEgYW5kIDUwMC8pO1xuICAgIGV4cGVjdCh2YWxpZGF0ZUJ1bGtDYW5jZWxMaW1pdCgtNSkpLnRvTWF0Y2goL2JldHdlZW4gMSBhbmQgNTAwLyk7XG4gICAgZXhwZWN0KHZhbGlkYXRlQnVsa0NhbmNlbExpbWl0KDEuNSkpLnRvTWF0Y2goL2JldHdlZW4gMSBhbmQgNTAwLyk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdmb3JtYXRCdWxrQ2FuY2VsU3VtbWFyeScsICgpID0+IHtcbiAgaXQoJ3JlbmRlcnMgZXZlcnkgb3V0Y29tZSBjYXRlZ29yeSBzbyBjb3VudHMgYWRkIHVwIHRvIHJlcXVlc3RlZCcsICgpID0+IHtcbiAgICBjb25zdCBzdW1tYXJ5ID0gZm9ybWF0QnVsa0NhbmNlbFN1bW1hcnkoe1xuICAgICAgc3VtbWFyeToge1xuICAgICAgICByZXF1ZXN0ZWQ6IDcsXG4gICAgICAgIGNhbmNlbGxlZDogMixcbiAgICAgICAgYWxyZWFkeUNhbmNlbGxlZDogMSxcbiAgICAgICAgbm90Q2FuY2VsbGFibGU6IDEsXG4gICAgICAgIG5vdEZvdW5kOiAzLFxuICAgICAgICBmYWlsZWQ6IDAsXG4gICAgICB9LFxuICAgICAgcmVzdWx0czogW10sXG4gICAgfSk7XG4gICAgZXhwZWN0KHN1bW1hcnkpLnRvQmUoXG4gICAgICBbXG4gICAgICAgICdEb25lOicsXG4gICAgICAgICcgIDIgY2FuY2VsbGVkJyxcbiAgICAgICAgJyAgMSBhbHJlYWR5IGNhbmNlbGxlZCcsXG4gICAgICAgICcgIDEgbm90IGNhbmNlbGxhYmxlJyxcbiAgICAgICAgJyAgMyBub3QgZm91bmQnLFxuICAgICAgICAnICAwIGZhaWxlZCcsXG4gICAgICBdLmpvaW4oJ1xcbicpXG4gICAgKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ2J1bGtDYW5jZWxGYWlsdXJlTGluZXMnLCAoKSA9PiB7XG4gIGl0KCdzdXJmYWNlcyBvbmx5IG5vdF9mb3VuZCwgbm90X2NhbmNlbGxhYmxlLCBhbmQgZmFpbGVkIHJ1bnMnLCAoKSA9PiB7XG4gICAgY29uc3QgbGluZXMgPSBidWxrQ2FuY2VsRmFpbHVyZUxpbmVzKHtcbiAgICAgIHN1bW1hcnk6IHtcbiAgICAgICAgcmVxdWVzdGVkOiA1LFxuICAgICAgICBjYW5jZWxsZWQ6IDEsXG4gICAgICAgIGFscmVhZHlDYW5jZWxsZWQ6IDEsXG4gICAgICAgIG5vdENhbmNlbGxhYmxlOiAxLFxuICAgICAgICBub3RGb3VuZDogMSxcbiAgICAgICAgZmFpbGVkOiAxLFxuICAgICAgfSxcbiAgICAgIHJlc3VsdHM6IFtcbiAgICAgICAgeyBydW5JZDogJ2EnLCBvdXRjb21lOiAnY2FuY2VsbGVkJyB9LFxuICAgICAgICB7IHJ1bklkOiAnYicsIG91dGNvbWU6ICdhbHJlYWR5X2NhbmNlbGxlZCcgfSxcbiAgICAgICAgeyBydW5JZDogJ2MnLCBvdXRjb21lOiAnbm90X2NhbmNlbGxhYmxlJywgc3RhdHVzOiAnY29tcGxldGVkJyB9LFxuICAgICAgICB7IHJ1bklkOiAnZCcsIG91dGNvbWU6ICdub3RfZm91bmQnIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBydW5JZDogJ2UnLFxuICAgICAgICAgIG91dGNvbWU6ICdmYWlsZWQnLFxuICAgICAgICAgIGNvZGU6ICdpbnRlcm5hbF9lcnJvcicsXG4gICAgICAgICAgcmV0cnlhYmxlOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgICBleHBlY3QobGluZXMpLnRvRXF1YWwoW1xuICAgICAgJyAg4pyXIGM6IG5vdCBjYW5jZWxsYWJsZSAoY29tcGxldGVkKScsXG4gICAgICAnICDinJcgZDogbm90IGZvdW5kJyxcbiAgICAgICcgIOKclyBlOiBmYWlsZWQgKGludGVybmFsX2Vycm9yLCByZXRyeWFibGUpJyxcbiAgICBdKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ3BlcmZvcm1CdWxrQ2FuY2VsJywgKCkgPT4ge1xuICBpdCgnd2FybnMgYW5kIGV4aXRzIDAgd2hlbiBubyBydW5zIG1hdGNoJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgbG9nZ2VyLCB3YXJucyB9ID0gbWFrZUxvZ2dlcigpO1xuICAgIGNvbnN0IHdvcmxkID0gbWFrZVdvcmxkKHsgcnVuczogW10gfSk7XG5cbiAgICBjb25zdCB7IGV4aXRDb2RlLCByZXN1bHQgfSA9IGF3YWl0IHBlcmZvcm1CdWxrQ2FuY2VsKHtcbiAgICAgIHdvcmxkLFxuICAgICAgbGltaXQ6IDUwLFxuICAgICAgY29uZmlybTogdHJ1ZSxcbiAgICAgIGxvZ2dlcixcbiAgICB9KTtcblxuICAgIGV4cGVjdChleGl0Q29kZSkudG9CZSgwKTtcbiAgICBleHBlY3QocmVzdWx0KS50b0JlVW5kZWZpbmVkKCk7XG4gICAgZXhwZWN0KHdhcm5zKS50b0NvbnRhaW4oJ05vIG1hdGNoaW5nIHJ1bnMgZm91bmQuJyk7XG4gIH0pO1xuXG4gIGl0KCdyZXN0cmljdHMgdG8gY2FuY2VsbGFibGUgc3RhdHVzZXMgYW5kIGV4Y2x1ZGVzIHRlcm1pbmFsIHJ1bnMgd2hlbiBubyBzdGF0dXMgaXMgcGlubmVkJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgbG9nZ2VyIH0gPSBtYWtlTG9nZ2VyKCk7XG4gICAgY29uc3QgY2FuY2VsTWFueSA9IHZpLmZuKFxuICAgICAgYXN5bmMgKFxuICAgICAgICByZXE6IEJ1bGtDYW5jZWxXb3JrZmxvd1J1bnNSZXF1ZXN0XG4gICAgICApOiBQcm9taXNlPEJ1bGtDYW5jZWxXb3JrZmxvd1J1bnNSZXN1bHQ+ID0+ICh7XG4gICAgICAgIHN1bW1hcnk6IHtcbiAgICAgICAgICByZXF1ZXN0ZWQ6IHJlcS5ydW5JZHMubGVuZ3RoLFxuICAgICAgICAgIGNhbmNlbGxlZDogcmVxLnJ1bklkcy5sZW5ndGgsXG4gICAgICAgICAgYWxyZWFkeUNhbmNlbGxlZDogMCxcbiAgICAgICAgICBub3RDYW5jZWxsYWJsZTogMCxcbiAgICAgICAgICBub3RGb3VuZDogMCxcbiAgICAgICAgICBmYWlsZWQ6IDAsXG4gICAgICAgIH0sXG4gICAgICAgIHJlc3VsdHM6IHJlcS5ydW5JZHMubWFwKChydW5JZCkgPT4gKHtcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICBvdXRjb21lOiAnY2FuY2VsbGVkJyBhcyBjb25zdCxcbiAgICAgICAgfSkpLFxuICAgICAgfSlcbiAgICApO1xuICAgIGNvbnN0IHdvcmxkID0gbWFrZVdvcmxkKHtcbiAgICAgIHJ1bnM6IFtcbiAgICAgICAgeyBydW5JZDogJ3AxJywgd29ya2Zsb3dOYW1lOiAnd2YnLCBzdGF0dXM6ICdwZW5kaW5nJyB9LFxuICAgICAgICB7IHJ1bklkOiAncjEnLCB3b3JrZmxvd05hbWU6ICd3ZicsIHN0YXR1czogJ3J1bm5pbmcnIH0sXG4gICAgICAgIC8vIFRlcm1pbmFsIOKAlCBtdXN0IG5ldmVyIGJlIGZldGNoZWQgb3IgY2FuY2VsbGVkLlxuICAgICAgICB7IHJ1bklkOiAnZG9uZScsIHdvcmtmbG93TmFtZTogJ3dmJywgc3RhdHVzOiAnY29tcGxldGVkJyB9LFxuICAgICAgXSxcbiAgICAgIGNhbmNlbE1hbnksXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IGV4aXRDb2RlIH0gPSBhd2FpdCBwZXJmb3JtQnVsa0NhbmNlbCh7XG4gICAgICB3b3JsZCxcbiAgICAgIGxpbWl0OiA1MCxcbiAgICAgIGNvbmZpcm06IHRydWUsXG4gICAgICBsb2dnZXIsXG4gICAgfSk7XG5cbiAgICBleHBlY3QoZXhpdENvZGUpLnRvQmUoMCk7XG4gICAgY29uc3QgcmVxdWVzdGVkU3RhdHVzZXMgPSAod29ybGQucnVucy5saXN0IGFzIGFueSkubW9jay5jYWxscy5tYXAoXG4gICAgICAoYzogW3sgc3RhdHVzPzogc3RyaW5nIH1dKSA9PiBjWzBdPy5zdGF0dXNcbiAgICApO1xuICAgIGV4cGVjdChyZXF1ZXN0ZWRTdGF0dXNlcykudG9Db250YWluKCdwZW5kaW5nJyk7XG4gICAgZXhwZWN0KHJlcXVlc3RlZFN0YXR1c2VzKS50b0NvbnRhaW4oJ3J1bm5pbmcnKTtcbiAgICBleHBlY3QocmVxdWVzdGVkU3RhdHVzZXMpLm5vdC50b0NvbnRhaW4oJ2NvbXBsZXRlZCcpO1xuICAgIC8vIE9ubHkgdGhlIGNhbmNlbGxhYmxlIHJ1bnMgcmVhY2ggY2FuY2VsTWFueTsgdGhlIGNvbXBsZXRlZCBydW4gaXMgZXhjbHVkZWQuXG4gICAgZXhwZWN0KGNhbmNlbE1hbnkpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICBleHBlY3QoWy4uLmNhbmNlbE1hbnkubW9jay5jYWxsc1swXVswXS5ydW5JZHNdLnNvcnQoKSkudG9FcXVhbChbXG4gICAgICAncDEnLFxuICAgICAgJ3IxJyxcbiAgICBdKTtcbiAgfSk7XG5cbiAgaXQoJ3JvdW5kLXJvYmlucyBzdGF0dXMgcGFnZXMgYmVmb3JlIGFwcGx5aW5nIHRoZSBiYXRjaCBsaW1pdCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IGxvZ2dlciB9ID0gbWFrZUxvZ2dlcigpO1xuICAgIGNvbnN0IGNhbmNlbE1hbnkgPSB2aS5mbihcbiAgICAgIGFzeW5jIChcbiAgICAgICAgcmVxOiBCdWxrQ2FuY2VsV29ya2Zsb3dSdW5zUmVxdWVzdFxuICAgICAgKTogUHJvbWlzZTxCdWxrQ2FuY2VsV29ya2Zsb3dSdW5zUmVzdWx0PiA9PiAoe1xuICAgICAgICBzdW1tYXJ5OiB7XG4gICAgICAgICAgcmVxdWVzdGVkOiByZXEucnVuSWRzLmxlbmd0aCxcbiAgICAgICAgICBjYW5jZWxsZWQ6IHJlcS5ydW5JZHMubGVuZ3RoLFxuICAgICAgICAgIGFscmVhZHlDYW5jZWxsZWQ6IDAsXG4gICAgICAgICAgbm90Q2FuY2VsbGFibGU6IDAsXG4gICAgICAgICAgbm90Rm91bmQ6IDAsXG4gICAgICAgICAgZmFpbGVkOiAwLFxuICAgICAgICB9LFxuICAgICAgICByZXN1bHRzOiByZXEucnVuSWRzLm1hcCgocnVuSWQpID0+ICh7XG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgb3V0Y29tZTogJ2NhbmNlbGxlZCcgYXMgY29uc3QsXG4gICAgICAgIH0pKSxcbiAgICAgIH0pXG4gICAgKTtcbiAgICBjb25zdCB3b3JsZCA9IG1ha2VXb3JsZCh7XG4gICAgICBydW5zOiBbXG4gICAgICAgIC4uLkFycmF5LmZyb20oeyBsZW5ndGg6IDUgfSwgKF8sIGluZGV4KSA9PiAoe1xuICAgICAgICAgIHJ1bklkOiBgciR7aW5kZXggKyAxfWAsXG4gICAgICAgICAgd29ya2Zsb3dOYW1lOiAnd2YnLFxuICAgICAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgICAgIHN0YXJ0ZWRBdDogbmV3IERhdGUoMjAyNiwgMCwgaW5kZXggKyAxKS50b0lTT1N0cmluZygpLFxuICAgICAgICB9KSksXG4gICAgICAgIC4uLkFycmF5LmZyb20oeyBsZW5ndGg6IDMgfSwgKF8sIGluZGV4KSA9PiAoe1xuICAgICAgICAgIHJ1bklkOiBgcCR7aW5kZXggKyAxfWAsXG4gICAgICAgICAgd29ya2Zsb3dOYW1lOiAnd2YnLFxuICAgICAgICAgIHN0YXR1czogJ3BlbmRpbmcnLFxuICAgICAgICB9KSksXG4gICAgICBdLFxuICAgICAgY2FuY2VsTWFueSxcbiAgICB9KTtcblxuICAgIGF3YWl0IHBlcmZvcm1CdWxrQ2FuY2VsKHtcbiAgICAgIHdvcmxkLFxuICAgICAgbGltaXQ6IDUsXG4gICAgICBjb25maXJtOiB0cnVlLFxuICAgICAgbG9nZ2VyLFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KGNhbmNlbE1hbnkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHtcbiAgICAgIHJ1bklkczogWydwMScsICdyMScsICdwMicsICdyMicsICdwMyddLFxuICAgICAgY2FuY2VsUmVhc29uOiBDTElfQ0FOQ0VMX1JFQVNPTixcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ3VzZXMgdGhlIGNhbmNlbE1hbnkgZmFzdCBwYXRoIGluIGEgc2luZ2xlIGNhbGwgYW5kIHNraXBzIHBlci1ydW4gZXZlbnRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgbG9nZ2VyIH0gPSBtYWtlTG9nZ2VyKCk7XG4gICAgY29uc3QgY2FuY2VsTWFueSA9IHZpLmZuKFxuICAgICAgYXN5bmMgKCk6IFByb21pc2U8QnVsa0NhbmNlbFdvcmtmbG93UnVuc1Jlc3VsdD4gPT4gKHtcbiAgICAgICAgc3VtbWFyeToge1xuICAgICAgICAgIHJlcXVlc3RlZDogMixcbiAgICAgICAgICBjYW5jZWxsZWQ6IDIsXG4gICAgICAgICAgYWxyZWFkeUNhbmNlbGxlZDogMCxcbiAgICAgICAgICBub3RDYW5jZWxsYWJsZTogMCxcbiAgICAgICAgICBub3RGb3VuZDogMCxcbiAgICAgICAgICBmYWlsZWQ6IDAsXG4gICAgICAgIH0sXG4gICAgICAgIHJlc3VsdHM6IFtcbiAgICAgICAgICB7IHJ1bklkOiAncjEnLCBvdXRjb21lOiAnY2FuY2VsbGVkJyB9LFxuICAgICAgICAgIHsgcnVuSWQ6ICdyMicsIG91dGNvbWU6ICdjYW5jZWxsZWQnIH0sXG4gICAgICAgIF0sXG4gICAgICB9KVxuICAgICk7XG4gICAgY29uc3Qgd29ybGQgPSBtYWtlV29ybGQoe1xuICAgICAgcnVuczogW1xuICAgICAgICB7IHJ1bklkOiAncjEnLCB3b3JrZmxvd05hbWU6ICd3ZicsIHN0YXR1czogJ3J1bm5pbmcnIH0sXG4gICAgICAgIHsgcnVuSWQ6ICdyMicsIHdvcmtmbG93TmFtZTogJ3dmJywgc3RhdHVzOiAncnVubmluZycgfSxcbiAgICAgIF0sXG4gICAgICBjYW5jZWxNYW55LFxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBleGl0Q29kZSB9ID0gYXdhaXQgcGVyZm9ybUJ1bGtDYW5jZWwoe1xuICAgICAgd29ybGQsXG4gICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgIGxpbWl0OiA1MCxcbiAgICAgIGNvbmZpcm06IHRydWUsXG4gICAgICBsb2dnZXIsXG4gICAgfSk7XG5cbiAgICBleHBlY3QoZXhpdENvZGUpLnRvQmUoMCk7XG4gICAgZXhwZWN0KGNhbmNlbE1hbnkpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICBleHBlY3QoY2FuY2VsTWFueSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoe1xuICAgICAgcnVuSWRzOiBbJ3IxJywgJ3IyJ10sXG4gICAgICBjYW5jZWxSZWFzb246IENMSV9DQU5DRUxfUkVBU09OLFxuICAgIH0pO1xuICAgIC8vIEZhc3QgcGF0aCBtdXN0IG5vdCBmYWxsIGJhY2sgdG8gcGVyLXJ1biBldmVudCBjcmVhdGlvbi5cbiAgICBleHBlY3Qod29ybGQuZXZlbnRzLmNyZWF0ZSBhcyBhbnkpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xuXG4gIGl0KCdmYWxscyBiYWNrIHRvIHBlci1ydW4gY2FuY2VsbGF0aW9uIHdoZW4gY2FuY2VsTWFueSBpcyBhYnNlbnQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyBsb2dnZXIsIGxvZ3MgfSA9IG1ha2VMb2dnZXIoKTtcbiAgICBjb25zdCB3b3JsZCA9IG1ha2VXb3JsZCh7XG4gICAgICBydW5zOiBbXG4gICAgICAgIHsgcnVuSWQ6ICdyMScsIHdvcmtmbG93TmFtZTogJ3dmJywgc3RhdHVzOiAncnVubmluZycgfSxcbiAgICAgICAgeyBydW5JZDogJ3IyJywgd29ya2Zsb3dOYW1lOiAnd2YnLCBzdGF0dXM6ICdydW5uaW5nJyB9LFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgZXhpdENvZGUsIHJlc3VsdCB9ID0gYXdhaXQgcGVyZm9ybUJ1bGtDYW5jZWwoe1xuICAgICAgd29ybGQsXG4gICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgIGxpbWl0OiA1MCxcbiAgICAgIGNvbmZpcm06IHRydWUsXG4gICAgICBsb2dnZXIsXG4gICAgfSk7XG5cbiAgICBleHBlY3QoZXhpdENvZGUpLnRvQmUoMCk7XG4gICAgZXhwZWN0KHdvcmxkLmV2ZW50cy5jcmVhdGUgYXMgYW55KS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMik7XG4gICAgZXhwZWN0KHdvcmxkLmV2ZW50cy5jcmVhdGUgYXMgYW55KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICdyMScsXG4gICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgIGV2ZW50RGF0YTogeyBjYW5jZWxSZWFzb246IENMSV9DQU5DRUxfUkVBU09OIH0sXG4gICAgICB9KSxcbiAgICAgIGV4cGVjdC5hbnl0aGluZygpXG4gICAgKTtcbiAgICBleHBlY3QocmVzdWx0Py5zdW1tYXJ5LmNhbmNlbGxlZCkudG9CZSgyKTtcbiAgICBleHBlY3QobG9ncy5qb2luKCdcXG4nKSkudG9Db250YWluKCcyIGNhbmNlbGxlZCcpO1xuICB9KTtcblxuICBpdCgncHJpbnRzIHJlcnVuIGd1aWRhbmNlIHdoZW4gbW9yZSBydW5zIG1hdGNoIHRoYW4gd2VyZSBmZXRjaGVkJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgbG9nZ2VyLCB3YXJucyB9ID0gbWFrZUxvZ2dlcigpO1xuICAgIGNvbnN0IHdvcmxkID0gbWFrZVdvcmxkKHtcbiAgICAgIHJ1bnM6IFt7IHJ1bklkOiAncjEnLCB3b3JrZmxvd05hbWU6ICd3ZicsIHN0YXR1czogJ3J1bm5pbmcnIH1dLFxuICAgICAgaGFzTW9yZTogdHJ1ZSxcbiAgICAgIGNhbmNlbE1hbnk6IGFzeW5jICgpID0+ICh7XG4gICAgICAgIHN1bW1hcnk6IHtcbiAgICAgICAgICByZXF1ZXN0ZWQ6IDEsXG4gICAgICAgICAgY2FuY2VsbGVkOiAxLFxuICAgICAgICAgIGFscmVhZHlDYW5jZWxsZWQ6IDAsXG4gICAgICAgICAgbm90Q2FuY2VsbGFibGU6IDAsXG4gICAgICAgICAgbm90Rm91bmQ6IDAsXG4gICAgICAgICAgZmFpbGVkOiAwLFxuICAgICAgICB9LFxuICAgICAgICByZXN1bHRzOiBbeyBydW5JZDogJ3IxJywgb3V0Y29tZTogJ2NhbmNlbGxlZCcgfV0sXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIGF3YWl0IHBlcmZvcm1CdWxrQ2FuY2VsKHtcbiAgICAgIHdvcmxkLFxuICAgICAgc3RhdHVzOiAncnVubmluZycsXG4gICAgICBsaW1pdDogMSxcbiAgICAgIGNvbmZpcm06IHRydWUsXG4gICAgICBsb2dnZXIsXG4gICAgfSk7XG5cbiAgICBleHBlY3Qod2FybnMpLnRvQ29udGFpbihIQVNfTU9SRV9HVUlEQU5DRSk7XG4gIH0pO1xuXG4gIGl0KCdleGl0cyAxIGFuZCBzdXJmYWNlcyBwZXItcnVuIGZhaWx1cmVzIHdoZW4gYSBydW4gZmFpbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyBsb2dnZXIsIHdhcm5zIH0gPSBtYWtlTG9nZ2VyKCk7XG4gICAgY29uc3Qgd29ybGQgPSBtYWtlV29ybGQoe1xuICAgICAgcnVuczogW1xuICAgICAgICB7IHJ1bklkOiAncjEnLCB3b3JrZmxvd05hbWU6ICd3ZicsIHN0YXR1czogJ3J1bm5pbmcnIH0sXG4gICAgICAgIHsgcnVuSWQ6ICdyMicsIHdvcmtmbG93TmFtZTogJ3dmJywgc3RhdHVzOiAncnVubmluZycgfSxcbiAgICAgIF0sXG4gICAgICBjYW5jZWxNYW55OiBhc3luYyAoKSA9PiAoe1xuICAgICAgICBzdW1tYXJ5OiB7XG4gICAgICAgICAgcmVxdWVzdGVkOiAyLFxuICAgICAgICAgIGNhbmNlbGxlZDogMSxcbiAgICAgICAgICBhbHJlYWR5Q2FuY2VsbGVkOiAwLFxuICAgICAgICAgIG5vdENhbmNlbGxhYmxlOiAwLFxuICAgICAgICAgIG5vdEZvdW5kOiAwLFxuICAgICAgICAgIGZhaWxlZDogMSxcbiAgICAgICAgfSxcbiAgICAgICAgcmVzdWx0czogW1xuICAgICAgICAgIHsgcnVuSWQ6ICdyMScsIG91dGNvbWU6ICdjYW5jZWxsZWQnIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcnVuSWQ6ICdyMicsXG4gICAgICAgICAgICBvdXRjb21lOiAnZmFpbGVkJyxcbiAgICAgICAgICAgIGNvZGU6ICdpbnRlcm5hbF9lcnJvcicsXG4gICAgICAgICAgICByZXRyeWFibGU6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBleGl0Q29kZSB9ID0gYXdhaXQgcGVyZm9ybUJ1bGtDYW5jZWwoe1xuICAgICAgd29ybGQsXG4gICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgIGxpbWl0OiA1MCxcbiAgICAgIGNvbmZpcm06IHRydWUsXG4gICAgICBsb2dnZXIsXG4gICAgfSk7XG5cbiAgICBleHBlY3QoZXhpdENvZGUpLnRvQmUoMSk7XG4gICAgZXhwZWN0KHdhcm5zKS50b0NvbnRhaW4oJyAg4pyXIHIyOiBmYWlsZWQgKGludGVybmFsX2Vycm9yLCByZXRyeWFibGUpJyk7XG4gIH0pO1xuXG4gIGl0KCdhYm9ydHMgd2l0aG91dCBjYW5jZWxsaW5nIHdoZW4gY29uZmlybWF0aW9uIGlzIGRlY2xpbmVkJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgbG9nZ2VyLCBsb2dzIH0gPSBtYWtlTG9nZ2VyKCk7XG4gICAgY29uc3QgY2FuY2VsTWFueSA9IHZpLmZuKCk7XG4gICAgY29uc3Qgd29ybGQgPSBtYWtlV29ybGQoe1xuICAgICAgcnVuczogW3sgcnVuSWQ6ICdyMScsIHdvcmtmbG93TmFtZTogJ3dmJywgc3RhdHVzOiAncnVubmluZycgfV0sXG4gICAgICBjYW5jZWxNYW55OiBjYW5jZWxNYW55IGFzIGFueSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgZXhpdENvZGUgfSA9IGF3YWl0IHBlcmZvcm1CdWxrQ2FuY2VsKHtcbiAgICAgIHdvcmxkLFxuICAgICAgc3RhdHVzOiAncnVubmluZycsXG4gICAgICBsaW1pdDogNTAsXG4gICAgICBjb25maXJtOiBmYWxzZSxcbiAgICAgIGxvZ2dlcixcbiAgICAgIHByb21wdENvbmZpcm06IGFzeW5jICgpID0+IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KGV4aXRDb2RlKS50b0JlKDApO1xuICAgIGV4cGVjdChsb2dzKS50b0NvbnRhaW4oJ0Fib3J0ZWQuJyk7XG4gICAgZXhwZWN0KGNhbmNlbE1hbnkpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xufSk7XG4iXX0=
390
+ describe('performBulkCancel analytics window probe', () => {
391
+ it('probes the plan window once for the whole status fan-out', async () => {
392
+ const windowStart = '2026-08-03T00:00:00.000Z';
393
+ const cancelMany = async (req) => ({
394
+ summary: {
395
+ requested: req.runIds.length,
396
+ cancelled: req.runIds.length,
397
+ alreadyCancelled: 0,
398
+ notCancellable: 0,
399
+ notFound: 0,
400
+ failed: 0,
401
+ },
402
+ results: req.runIds.map((runId) => ({
403
+ runId,
404
+ outcome: 'cancelled',
405
+ })),
406
+ });
407
+ const world = makeWorld({
408
+ analyticsWindowStart: windowStart,
409
+ runs: [
410
+ { runId: 'p1', workflowName: 'wf', status: 'pending' },
411
+ { runId: 'r1', workflowName: 'wf', status: 'running' },
412
+ ],
413
+ cancelMany,
414
+ });
415
+ const { logger } = makeLogger();
416
+ const { exitCode } = await performBulkCancel({
417
+ world,
418
+ limit: 50,
419
+ confirm: true,
420
+ logger,
421
+ });
422
+ expect(exitCode).toBe(0);
423
+ const calls = (world.analytics?.runs.list).mock.calls.map((c) => c[0]);
424
+ // Exactly one probe, regardless of how many statuses are fanned out.
425
+ const probes = calls.filter((c) => c.pagination?.limit === 1);
426
+ expect(probes).toHaveLength(1);
427
+ // Every real listing is bounded by the window the probe resolved.
428
+ const listings = calls.filter((c) => c.pagination?.limit !== 1);
429
+ expect(listings.length).toBeGreaterThan(1);
430
+ for (const listing of listings) {
431
+ expect(listing.startTime).toBe(windowStart);
432
+ expect(listing.endTime).toBeDefined();
433
+ }
434
+ // Storage is not consulted when analytics is available.
435
+ expect(world.runs.list).not.toHaveBeenCalled();
436
+ });
437
+ });
438
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVsay1jYW5jZWwudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvYnVsay1jYW5jZWwudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ2xELE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsaUJBQWlCLEVBQ2pCLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsaUJBQWlCLEVBQ2pCLHVCQUF1QixHQUN4QixNQUFNLGtCQUFrQixDQUFDO0FBUzFCLDBFQUEwRTtBQUMxRSxTQUFTLFVBQVU7SUFDakIsTUFBTSxJQUFJLEdBQWEsRUFBRSxDQUFDO0lBQzFCLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztJQUMzQixNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7SUFDNUIsT0FBTztRQUNMLE1BQU0sRUFBRTtZQUNOLEdBQUcsRUFBRSxDQUFDLENBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDaEMsSUFBSSxFQUFFLENBQUMsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNsQyxLQUFLLEVBQUUsQ0FBQyxDQUFTLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ3JDO1FBQ0QsSUFBSTtRQUNKLEtBQUs7UUFDTCxNQUFNO0tBQ1AsQ0FBQztBQUNKLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxTQUFTLENBQUMsSUFhbEI7SUFDQyxNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMs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Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1xuICBCdWxrQ2FuY2VsV29ya2Zsb3dSdW5zUmVxdWVzdCxcbiAgQnVsa0NhbmNlbFdvcmtmbG93UnVuc1Jlc3VsdCxcbiAgV29ybGQsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBkZXNjcmliZSwgZXhwZWN0LCBpdCwgdmkgfSBmcm9tICd2aXRlc3QnO1xuaW1wb3J0IHtcbiAgYnVsa0NhbmNlbEZhaWx1cmVMaW5lcyxcbiAgQ0xJX0NBTkNFTF9SRUFTT04sXG4gIGZvcm1hdEJ1bGtDYW5jZWxTdW1tYXJ5LFxuICBIQVNfTU9SRV9HVUlEQU5DRSxcbiAgcGVyZm9ybUJ1bGtDYW5jZWwsXG4gIHZhbGlkYXRlQnVsa0NhbmNlbExpbWl0LFxufSBmcm9tICcuL2J1bGstY2FuY2VsLmpzJztcblxuaW50ZXJmYWNlIEZha2VSdW4ge1xuICBydW5JZDogc3RyaW5nO1xuICB3b3JrZmxvd05hbWU6IHN0cmluZztcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIHN0YXJ0ZWRBdD86IHN0cmluZztcbn1cblxuLyoqIENvbGxlY3RzIGxvZ2dlciBvdXRwdXQgc28gYXNzZXJ0aW9ucyBjYW4gaW5zcGVjdCB3aGF0IHRoZSB1c2VyIHNhdy4gKi9cbmZ1bmN0aW9uIG1ha2VMb2dnZXIoKSB7XG4gIGNvbnN0IGxvZ3M6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHdhcm5zOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gIHJldHVybiB7XG4gICAgbG9nZ2VyOiB7XG4gICAgICBsb2c6IChtOiBzdHJpbmcpID0+IGxvZ3MucHVzaChtKSxcbiAgICAgIHdhcm46IChtOiBzdHJpbmcpID0+IHdhcm5zLnB1c2gobSksXG4gICAgICBlcnJvcjogKG06IHN0cmluZykgPT4gZXJyb3JzLnB1c2gobSksXG4gICAgfSxcbiAgICBsb2dzLFxuICAgIHdhcm5zLFxuICAgIGVycm9ycyxcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIG1pbmltYWwgZmFrZSB3b3JsZC4gYGNhbmNlbE1hbnlgIGlzIGF0dGFjaGVkIG9ubHkgd2hlbiBwcm92aWRlZCxcbiAqIHdoaWNoIGlzIGhvdyB7QGxpbmsgcGVyZm9ybUJ1bGtDYW5jZWx9ICh2aWEgYGNhbmNlbFJ1bnNgKSBkZWNpZGVzIGJldHdlZW5cbiAqIHRoZSBzaW5nbGUtcmVxdWVzdCBmYXN0IHBhdGggYW5kIHRoZSBwZXItcnVuIGZhbGxiYWNrLlxuICovXG5mdW5jdGlvbiBtYWtlV29ybGQob3B0czoge1xuICBydW5zOiBGYWtlUnVuW107XG4gIGhhc01vcmU/OiBib29sZWFuO1xuICBjYW5jZWxNYW55PzogKFxuICAgIHJlcXVlc3Q6IEJ1bGtDYW5jZWxXb3JrZmxvd1J1bnNSZXF1ZXN0XG4gICkgPT4gUHJvbWlzZTxCdWxrQ2FuY2VsV29ya2Zsb3dSdW5zUmVzdWx0PjtcbiAgZXZlbnRzQ3JlYXRlPzogKHJ1bklkOiBzdHJpbmcpID0+IFByb21pc2U8dW5rbm93bj47XG4gIC8qKlxuICAgKiBBdHRhY2ggYW4gYW5hbHl0aWNzIG5hbWVzcGFjZSB3aG9zZSBsaXN0aW5ncyByZXBvcnQgYSBwbGFuIHdpbmRvdywgc28gYVxuICAgKiB0ZXN0IGNhbiBleGVyY2lzZSB0aGUgcHJvYmUtYW5kLXdpZGVuIHBhdGguIExlZnQgb2ZmIGJ5IGRlZmF1bHQ6IHdpdGhvdXRcbiAgICogaXQgYHBlcmZvcm1CdWxrQ2FuY2VsYCByZWFkcyBzdG9yYWdlLlxuICAgKi9cbiAgYW5hbHl0aWNzV2luZG93U3RhcnQ/OiBzdHJpbmc7XG59KTogV29ybGQge1xuICBjb25zdCBydW5zQnlJZCA9IG5ldyBNYXAob3B0cy5ydW5zLm1hcCgocikgPT4gW3IucnVuSWQsIHJdKSk7XG4gIGNvbnN0IHdpbmRvd1N0YXJ0ID0gb3B0cy5hbmFseXRpY3NXaW5kb3dTdGFydDtcbiAgY29uc3QgYW5hbHl0aWNzTGlzdCA9IHdpbmRvd1N0YXJ0XG4gICAgPyB2aS5mbihhc3luYyAocGFyYW1zOiB7IHN0YXR1cz86IHN0cmluZyB9ID0ge30pID0+ICh7XG4gICAgICAgIGRhdGE6IHBhcmFtcy5zdGF0dXNcbiAgICAgICAgICA/IG9wdHMucnVucy5maWx0ZXIoKHIpID0+IHIuc3RhdHVzID09PSBwYXJhbXMuc3RhdHVzKVxuICAgICAgICAgIDogb3B0cy5ydW5zLFxuICAgICAgICBoYXNNb3JlOiBvcHRzLmhhc01vcmUgPz8gZmFsc2UsXG4gICAgICAgIHBhZ2VJbmZvOiB7XG4gICAgICAgICAgY3VycmVudExvb2tiYWNrRGF5czogMzAsXG4gICAgICAgICAgbWF4TG9va2JhY2tEYXlzOiAzMCxcbiAgICAgICAgICBjdXJyZW50V2luZG93U3RhcnQ6IG5ldyBEYXRlKHdpbmRvd1N0YXJ0KSxcbiAgICAgICAgICBtYXhXaW5kb3dTdGFydDogbmV3IERhdGUod2luZG93U3RhcnQpLFxuICAgICAgICAgIHVwZ3JhZGVBdmFpbGFibGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgfSkpXG4gICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHdvcmxkOiBhbnkgPSB7XG4gICAgYW5hbHl0aWNzOiBhbmFseXRpY3NMaXN0ID8geyBydW5zOiB7IGxpc3Q6IGFuYWx5dGljc0xpc3QgfSB9IDogdW5kZWZpbmVkLFxuICAgIHJ1bnM6IHtcbiAgICAgIC8vIFN0YXR1cy1hd2FyZSBzbyB0ZXN0cyBjYW4gc2VlZCBtaXhlZC1zdGF0dXMgcnVucyBhbmQgYXNzZXJ0IHRoYXQgb25seVxuICAgICAgLy8gdGhlIHJlcXVlc3RlZCBzdGF0dXMgaXMgbWF0Y2hlZC4gcGVyZm9ybUJ1bGtDYW5jZWwgYWx3YXlzIHBhc3NlcyBhXG4gICAgICAvLyBjb25jcmV0ZSBzdGF0dXMgcGVyIGNhbGwgKHRoZSBwaW5uZWQgb25lLCBvciBlYWNoIGNhbmNlbGxhYmxlIHN0YXR1cykuXG4gICAgICBsaXN0OiB2aS5mbihhc3luYyAocGFyYW1zOiB7IHN0YXR1cz86IHN0cmluZyB9ID0ge30pID0+ICh7XG4gICAgICAgIGRhdGE6IHBhcmFtcy5zdGF0dXNcbiAgICAgICAgICA/IG9wdHMucnVucy5maWx0ZXIoKHIpID0+IHIuc3RhdHVzID09PSBwYXJhbXMuc3RhdHVzKVxuICAgICAgICAgIDogb3B0cy5ydW5zLFxuICAgICAgICBoYXNNb3JlOiBvcHRzLmhhc01vcmUgPz8gZmFsc2UsXG4gICAgICB9KSksXG4gICAgICBnZXQ6IHZpLmZuKGFzeW5jIChydW5JZDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1biA9IHJ1bnNCeUlkLmdldChydW5JZCk7XG4gICAgICAgIGlmICghcnVuKSB0aHJvdyBuZXcgRXJyb3IoYHJ1biAke3J1bklkfSBub3QgZm91bmRgKTtcbiAgICAgICAgcmV0dXJuIHJ1bjtcbiAgICAgIH0pLFxuICAgIH0sXG4gICAgZXZlbnRzOiB7XG4gICAgICBjcmVhdGU6IHZpLmZuKGFzeW5jIChydW5JZDogc3RyaW5nKSA9PiBvcHRzLmV2ZW50c0NyZWF0ZT8uKHJ1bklkKSksXG4gICAgfSxcbiAgfTtcbiAgaWYgKG9wdHMuY2FuY2VsTWFueSkge1xuICAgIHdvcmxkLnJ1bnMuY2FuY2VsTWFueSA9IHZpLmZuKG9wdHMuY2FuY2VsTWFueSk7XG4gIH1cbiAgcmV0dXJuIHdvcmxkIGFzIFdvcmxkO1xufVxuXG5kZXNjcmliZSgndmFsaWRhdGVCdWxrQ2FuY2VsTGltaXQnLCAoKSA9PiB7XG4gIGl0KCdhY2NlcHRzIGludGVnZXJzIHdpdGhpbiBbMSwgMTAwXScsICgpID0+IHtcbiAgICBleHBlY3QodmFsaWRhdGVCdWxrQ2FuY2VsTGltaXQoMSkpLnRvQmVVbmRlZmluZWQoKTtcbiAgICBleHBlY3QodmFsaWRhdGVCdWxrQ2FuY2VsTGltaXQoNTApKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgZXhwZWN0KHZhbGlkYXRlQnVsa0NhbmNlbExpbWl0KDEwMCkpLnRvQmVVbmRlZmluZWQoKTtcbiAgfSk7XG5cbiAgaXQoJ3JlamVjdHMgb3V0LW9mLXJhbmdlIGFuZCBub24taW50ZWdlciB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHZhbGlkYXRlQnVsa0NhbmNlbExpbWl0KDApKS50b01hdGNoKC9iZXR3ZWVuIDEgYW5kIDEwMC8pO1xuICAgIGV4cGVjdCh2YWxpZGF0ZUJ1bGtDYW5jZWxMaW1pdCgxMDEpKS50b01hdGNoKC9iZXR3ZWVuIDEgYW5kIDEwMC8pO1xuICAgIGV4cGVjdCh2YWxpZGF0ZUJ1bGtDYW5jZWxMaW1pdCgtNSkpLnRvTWF0Y2goL2JldHdlZW4gMSBhbmQgMTAwLyk7XG4gICAgZXhwZWN0KHZhbGlkYXRlQnVsa0NhbmNlbExpbWl0KDEuNSkpLnRvTWF0Y2goL2JldHdlZW4gMSBhbmQgMTAwLyk7XG4gIH0pO1xuXG4gIC8vIDEwMS01MDAgd2FzIGFkdmVydGlzZWQgYW5kIGFjY2VwdGVkIGhlcmUsIGFuZCB0aGVuIHJlamVjdGVkIGJ5IHdoaWNoZXZlclxuICAvLyBwYXRoIHNlcnZlZCBpdDogdGhlIGFuYWx5dGljcyBydW5zIGxpc3RpbmcgcmVqZWN0cyBpdCBsb2NhbGx5LCBhbmQgdGhlXG4gIC8vIHN0b3JhZ2UgbGlzdGluZyBpdCBmYWxscyBiYWNrIHRvIGNhcHMgYXQgMTAwIHNlcnZlci1zaWRlLiBOZWl0aGVyIG1lc3NhZ2VcbiAgLy8gcmVhY2hlZCB0aGUgdXNlciwgYmVjYXVzZSBjYW5jZWwncyBjYXRjaCBwcmludGVkIG5vdGhpbmcgZm9yIGVpdGhlci5cbiAgaXQoJ3JlamVjdHMgdGhlIHJhbmdlIG5vIGJhY2tlbmQgZXZlciBzZXJ2ZWQnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHZhbGlkYXRlQnVsa0NhbmNlbExpbWl0KDIwMCkpLnRvQmVEZWZpbmVkKCk7XG4gICAgZXhwZWN0KHZhbGlkYXRlQnVsa0NhbmNlbExpbWl0KDUwMCkpLnRvQmVEZWZpbmVkKCk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdmb3JtYXRCdWxrQ2FuY2VsU3VtbWFyeScsICgpID0+IHtcbiAgaXQoJ3JlbmRlcnMgZXZlcnkgb3V0Y29tZSBjYXRlZ29yeSBzbyBjb3VudHMgYWRkIHVwIHRvIHJlcXVlc3RlZCcsICgpID0+IHtcbiAgICBjb25zdCBzdW1tYXJ5ID0gZm9ybWF0QnVsa0NhbmNlbFN1bW1hcnkoe1xuICAgICAgc3VtbWFyeToge1xuICAgICAgICByZXF1ZXN0ZWQ6IDcsXG4gICAgICAgIGNhbmNlbGxlZDogMixcbiAgICAgICAgYWxyZWFkeUNhbmNlbGxlZDogMSxcbiAgICAgICAgbm90Q2FuY2VsbGFibGU6IDEsXG4gICAgICAgIG5vdEZvdW5kOiAzLFxuICAgICAgICBmYWlsZWQ6IDAsXG4gICAgICB9LFxuICAgICAgcmVzdWx0czogW10sXG4gICAgfSk7XG4gICAgZXhwZWN0KHN1bW1hcnkpLnRvQmUoXG4gICAgICBbXG4gICAgICAgICdEb25lOicsXG4gICAgICAgICcgIDIgY2FuY2VsbGVkJyxcbiAgICAgICAgJyAgMSBhbHJlYWR5IGNhbmNlbGxlZCcsXG4gICAgICAgICcgIDEgbm90IGNhbmNlbGxhYmxlJyxcbiAgICAgICAgJyAgMyBub3QgZm91bmQnLFxuICAgICAgICAnICAwIGZhaWxlZCcsXG4gICAgICBdLmpvaW4oJ1xcbicpXG4gICAgKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ2J1bGtDYW5jZWxGYWlsdXJlTGluZXMnLCAoKSA9PiB7XG4gIGl0KCdzdXJmYWNlcyBvbmx5IG5vdF9mb3VuZCwgbm90X2NhbmNlbGxhYmxlLCBhbmQgZmFpbGVkIHJ1bnMnLCAoKSA9PiB7XG4gICAgY29uc3QgbGluZXMgPSBidWxrQ2FuY2VsRmFpbHVyZUxpbmVzKHtcbiAgICAgIHN1bW1hcnk6IHtcbiAgICAgICAgcmVxdWVzdGVkOiA1LFxuICAgICAgICBjYW5jZWxsZWQ6IDEsXG4gICAgICAgIGFscmVhZHlDYW5jZWxsZWQ6IDEsXG4gICAgICAgIG5vdENhbmNlbGxhYmxlOiAxLFxuICAgICAgICBub3RGb3VuZDogMSxcbiAgICAgICAgZmFpbGVkOiAxLFxuICAgICAgfSxcbiAgICAgIHJlc3VsdHM6IFtcbiAgICAgICAgeyBydW5JZDogJ2EnLCBvdXRjb21lOiAnY2FuY2VsbGVkJyB9LFxuICAgICAgICB7IHJ1bklkOiAnYicsIG91dGNvbWU6ICdhbHJlYWR5X2NhbmNlbGxlZCcgfSxcbiAgICAgICAgeyBydW5JZDogJ2MnLCBvdXRjb21lOiAnbm90X2NhbmNlbGxhYmxlJywgc3RhdHVzOiAnY29tcGxldGVkJyB9LFxuICAgICAgICB7IHJ1bklkOiAnZCcsIG91dGNvbWU6ICdub3RfZm91bmQnIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBydW5JZDogJ2UnLFxuICAgICAgICAgIG91dGNvbWU6ICdmYWlsZWQnLFxuICAgICAgICAgIGNvZGU6ICdpbnRlcm5hbF9lcnJvcicsXG4gICAgICAgICAgcmV0cnlhYmxlOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgICBleHBlY3QobGluZXMpLnRvRXF1YWwoW1xuICAgICAgJyAg4pyXIGM6IG5vdCBjYW5jZWxsYWJsZSAoY29tcGxldGVkKScsXG4gICAgICAnICDinJcgZDogbm90IGZvdW5kJyxcbiAgICAgICcgIOKclyBlOiBmYWlsZWQgKGludGVybmFsX2Vycm9yLCByZXRyeWFibGUpJyxcbiAgICBdKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ3BlcmZvcm1CdWxrQ2FuY2VsJywgKCkgPT4ge1xuICBpdCgnd2FybnMgYW5kIGV4aXRzIDAgd2hlbiBubyBydW5zIG1hdGNoJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgbG9nZ2VyLCB3YXJucyB9ID0gbWFrZUxvZ2dlcigpO1xuICAgIGNvbnN0IHdvcmxkID0gbWFrZVdvcmxkKHsgcnVuczogW10gfSk7XG5cbiAgICBjb25zdCB7IGV4aXRDb2RlLCByZXN1bHQgfSA9IGF3YWl0IHBlcmZvcm1CdWxrQ2FuY2VsKHtcbiAgICAgIHdvcmxkLFxuICAgICAgbGltaXQ6IDUwLFxuICAgICAgY29uZmlybTogdHJ1ZSxcbiAgICAgIGxvZ2dlcixcbiAgICB9KTtcblxuICAgIGV4cGVjdChleGl0Q29kZSkudG9CZSgwKTtcbiAgICBleHBlY3QocmVzdWx0KS50b0JlVW5kZWZpbmVkKCk7XG4gICAgZXhwZWN0KHdhcm5zKS50b0NvbnRhaW4oJ05vIG1hdGNoaW5nIHJ1bnMgZm91bmQuJyk7XG4gIH0pO1xuXG4gIGl0KCdyZXN0cmljdHMgdG8gY2FuY2VsbGFibGUgc3RhdHVzZXMgYW5kIGV4Y2x1ZGVzIHRlcm1pbmFsIHJ1bnMgd2hlbiBubyBzdGF0dXMgaXMgcGlubmVkJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgbG9nZ2VyIH0gPSBtYWtlTG9nZ2VyKCk7XG4gICAgY29uc3QgY2FuY2VsTWFueSA9IHZpLmZuKFxuICAgICAgYXN5bmMgKFxuICAgICAgICByZXE6IEJ1bGtDYW5jZWxXb3JrZmxvd1J1bnNSZXF1ZXN0XG4gICAgICApOiBQcm9taXNlPEJ1bGtDYW5jZWxXb3JrZmxvd1J1bnNSZXN1bHQ+ID0+ICh7XG4gICAgICAgIHN1bW1hcnk6IHtcbiAgICAgICAgICByZXF1ZXN0ZWQ6IHJlcS5ydW5JZHMubGVuZ3RoLFxuICAgICAgICAgIGNhbmNlbGxlZDogcmVxLnJ1bklkcy5sZW5ndGgsXG4gICAgICAgICAgYWxyZWFkeUNhbmNlbGxlZDogMCxcbiAgICAgICAgICBub3RDYW5jZWxsYWJsZTogMCxcbiAgICAgICAgICBub3RGb3VuZDogMCxcbiAgICAgICAgICBmYWlsZWQ6IDAsXG4gICAgICAgIH0sXG4gICAgICAgIHJlc3VsdHM6IHJlcS5ydW5JZHMubWFwKChydW5JZCkgPT4gKHtcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICBvdXRjb21lOiAnY2FuY2VsbGVkJyBhcyBjb25zdCxcbiAgICAgICAgfSkpLFxuICAgICAgfSlcbiAgICApO1xuICAgIGNvbnN0IHdvcmxkID0gbWFrZVdvcmxkKHtcbiAgICAgIHJ1bnM6IFtcbiAgICAgICAgeyBydW5JZDogJ3AxJywgd29ya2Zsb3dOYW1lOiAnd2YnLCBzdGF0dXM6ICdwZW5kaW5nJyB9LFxuICAgICAgICB7IHJ1bklkOiAncjEnLCB3b3JrZmxvd05hbWU6ICd3ZicsIHN0YXR1czogJ3J1bm5pbmcnIH0sXG4gICAgICAgIC8vIFRlcm1pbmFsIOKAlCBtdXN0IG5ldmVyIGJlIGZldGNoZWQgb3IgY2FuY2VsbGVkLlxuICAgICAgICB7IHJ1bklkOiAnZG9uZScsIHdvcmtmbG93TmFtZTogJ3dmJywgc3RhdHVzOiAnY29tcGxldGVkJyB9LFxuICAgICAgXSxcbiAgICAgIGNhbmNlbE1hbnksXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IGV4aXRDb2RlIH0gPSBhd2FpdCBwZXJmb3JtQnVsa0NhbmNlbCh7XG4gICAgICB3b3JsZCxcbiAgICAgIGxpbWl0OiA1MCxcbiAgICAgIGNvbmZpcm06IHRydWUsXG4gICAgICBsb2dnZXIsXG4gICAgfSk7XG5cbiAgICBleHBlY3QoZXhpdENvZGUpLnRvQmUoMCk7XG4gICAgY29uc3QgcmVxdWVzdGVkU3RhdHVzZXMgPSAod29ybGQucnVucy5saXN0IGFzIGFueSkubW9jay5jYWxscy5tYXAoXG4gICAgICAoYzogW3sgc3RhdHVzPzogc3RyaW5nIH1dKSA9PiBjWzBdPy5zdGF0dXNcbiAgICApO1xuICAgIGV4cGVjdChyZXF1ZXN0ZWRTdGF0dXNlcykudG9Db250YWluKCdwZW5kaW5nJyk7XG4gICAgZXhwZWN0KHJlcXVlc3RlZFN0YXR1c2VzKS50b0NvbnRhaW4oJ3J1bm5pbmcnKTtcbiAgICBleHBlY3QocmVxdWVzdGVkU3RhdHVzZXMpLm5vdC50b0NvbnRhaW4oJ2NvbXBsZXRlZCcpO1xuICAgIC8vIE9ubHkgdGhlIGNhbmNlbGxhYmxlIHJ1bnMgcmVhY2ggY2FuY2VsTWFueTsgdGhlIGNvbXBsZXRlZCBydW4gaXMgZXhjbHVkZWQuXG4gICAgZXhwZWN0KGNhbmNlbE1hbnkpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICBleHBlY3QoWy4uLmNhbmNlbE1hbnkubW9jay5jYWxsc1swXVswXS5ydW5JZHNdLnNvcnQoKSkudG9FcXVhbChbXG4gICAgICAncDEnLFxuICAgICAgJ3IxJyxcbiAgICBdKTtcbiAgfSk7XG5cbiAgaXQoJ3JvdW5kLXJvYmlucyBzdGF0dXMgcGFnZXMgYmVmb3JlIGFwcGx5aW5nIHRoZSBiYXRjaCBsaW1pdCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IGxvZ2dlciB9ID0gbWFrZUxvZ2dlcigpO1xuICAgIGNvbnN0IGNhbmNlbE1hbnkgPSB2aS5mbihcbiAgICAgIGFzeW5jIChcbiAgICAgICAgcmVxOiBCdWxrQ2FuY2VsV29ya2Zsb3dSdW5zUmVxdWVzdFxuICAgICAgKTogUHJvbWlzZTxCdWxrQ2FuY2VsV29ya2Zsb3dSdW5zUmVzdWx0PiA9PiAoe1xuICAgICAgICBzdW1tYXJ5OiB7XG4gICAgICAgICAgcmVxdWVzdGVkOiByZXEucnVuSWRzLmxlbmd0aCxcbiAgICAgICAgICBjYW5jZWxsZWQ6IHJlcS5ydW5JZHMubGVuZ3RoLFxuICAgICAgICAgIGFscmVhZHlDYW5jZWxsZWQ6IDAsXG4gICAgICAgICAgbm90Q2FuY2VsbGFibGU6IDAsXG4gICAgICAgICAgbm90Rm91bmQ6IDAsXG4gICAgICAgICAgZmFpbGVkOiAwLFxuICAgICAgICB9LFxuICAgICAgICByZXN1bHRzOiByZXEucnVuSWRzLm1hcCgocnVuSWQpID0+ICh7XG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgb3V0Y29tZTogJ2NhbmNlbGxlZCcgYXMgY29uc3QsXG4gICAgICAgIH0pKSxcbiAgICAgIH0pXG4gICAgKTtcbiAgICBjb25zdCB3b3JsZCA9IG1ha2VXb3JsZCh7XG4gICAgICBydW5zOiBbXG4gICAgICAgIC4uLkFycmF5LmZyb20oeyBsZW5ndGg6IDUgfSwgKF8sIGluZGV4KSA9PiAoe1xuICAgICAgICAgIHJ1bklkOiBgciR7aW5kZXggKyAxfWAsXG4gICAgICAgICAgd29ya2Zsb3dOYW1lOiAnd2YnLFxuICAgICAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgICAgIHN0YXJ0ZWRBdDogbmV3IERhdGUoMjAyNiwgMCwgaW5kZXggKyAxKS50b0lTT1N0cmluZygpLFxuICAgICAgICB9KSksXG4gICAgICAgIC4uLkFycmF5LmZyb20oeyBsZW5ndGg6IDMgfSwgKF8sIGluZGV4KSA9PiAoe1xuICAgICAgICAgIHJ1bklkOiBgcCR7aW5kZXggKyAxfWAsXG4gICAgICAgICAgd29ya2Zsb3dOYW1lOiAnd2YnLFxuICAgICAgICAgIHN0YXR1czogJ3BlbmRpbmcnLFxuICAgICAgICB9KSksXG4gICAgICBdLFxuICAgICAgY2FuY2VsTWFueSxcbiAgICB9KTtcblxuICAgIGF3YWl0IHBlcmZvcm1CdWxrQ2FuY2VsKHtcbiAgICAgIHdvcmxkLFxuICAgICAgbGltaXQ6IDUsXG4gICAgICBjb25maXJtOiB0cnVlLFxuICAgICAgbG9nZ2VyLFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KGNhbmNlbE1hbnkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHtcbiAgICAgIHJ1bklkczogWydwMScsICdyMScsICdwMicsICdyMicsICdwMyddLFxuICAgICAgY2FuY2VsUmVhc29uOiBDTElfQ0FOQ0VMX1JFQVNPTixcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ3VzZXMgdGhlIGNhbmNlbE1hbnkgZmFzdCBwYXRoIGluIGEgc2luZ2xlIGNhbGwgYW5kIHNraXBzIHBlci1ydW4gZXZlbnRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgbG9nZ2VyIH0gPSBtYWtlTG9nZ2VyKCk7XG4gICAgY29uc3QgY2FuY2VsTWFueSA9IHZpLmZuKFxuICAgICAgYXN5bmMgKCk6IFByb21pc2U8QnVsa0NhbmNlbFdvcmtmbG93UnVuc1Jlc3VsdD4gPT4gKHtcbiAgICAgICAgc3VtbWFyeToge1xuICAgICAgICAgIHJlcXVlc3RlZDogMixcbiAgICAgICAgICBjYW5jZWxsZWQ6IDIsXG4gICAgICAgICAgYWxyZWFkeUNhbmNlbGxlZDogMCxcbiAgICAgICAgICBub3RDYW5jZWxsYWJsZTogMCxcbiAgICAgICAgICBub3RGb3VuZDogMCxcbiAgICAgICAgICBmYWlsZWQ6IDAsXG4gICAgICAgIH0sXG4gICAgICAgIHJlc3VsdHM6IFtcbiAgICAgICAgICB7IHJ1bklkOiAncjEnLCBvdXRjb21lOiAnY2FuY2VsbGVkJyB9LFxuICAgICAgICAgIHsgcnVuSWQ6ICdyMicsIG91dGNvbWU6ICdjYW5jZWxsZWQnIH0sXG4gICAgICAgIF0sXG4gICAgICB9KVxuICAgICk7XG4gICAgY29uc3Qgd29ybGQgPSBtYWtlV29ybGQoe1xuICAgICAgcnVuczogW1xuICAgICAgICB7IHJ1bklkOiAncjEnLCB3b3JrZmxvd05hbWU6ICd3ZicsIHN0YXR1czogJ3J1bm5pbmcnIH0sXG4gICAgICAgIHsgcnVuSWQ6ICdyMicsIHdvcmtmbG93TmFtZTogJ3dmJywgc3RhdHVzOiAncnVubmluZycgfSxcbiAgICAgIF0sXG4gICAgICBjYW5jZWxNYW55LFxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBleGl0Q29kZSB9ID0gYXdhaXQgcGVyZm9ybUJ1bGtDYW5jZWwoe1xuICAgICAgd29ybGQsXG4gICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgIGxpbWl0OiA1MCxcbiAgICAgIGNvbmZpcm06IHRydWUsXG4gICAgICBsb2dnZXIsXG4gICAgfSk7XG5cbiAgICBleHBlY3QoZXhpdENvZGUpLnRvQmUoMCk7XG4gICAgZXhwZWN0KGNhbmNlbE1hbnkpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICBleHBlY3QoY2FuY2VsTWFueSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoe1xuICAgICAgcnVuSWRzOiBbJ3IxJywgJ3IyJ10sXG4gICAgICBjYW5jZWxSZWFzb246IENMSV9DQU5DRUxfUkVBU09OLFxuICAgIH0pO1xuICAgIC8vIEZhc3QgcGF0aCBtdXN0IG5vdCBmYWxsIGJhY2sgdG8gcGVyLXJ1biBldmVudCBjcmVhdGlvbi5cbiAgICBleHBlY3Qod29ybGQuZXZlbnRzLmNyZWF0ZSBhcyBhbnkpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xuXG4gIGl0KCdmYWxscyBiYWNrIHRvIHBlci1ydW4gY2FuY2VsbGF0aW9uIHdoZW4gY2FuY2VsTWFueSBpcyBhYnNlbnQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyBsb2dnZXIsIGxvZ3MgfSA9IG1ha2VMb2dnZXIoKTtcbiAgICBjb25zdCB3b3JsZCA9IG1ha2VXb3JsZCh7XG4gICAgICBydW5zOiBbXG4gICAgICAgIHsgcnVuSWQ6ICdyMScsIHdvcmtmbG93TmFtZTogJ3dmJywgc3RhdHVzOiAncnVubmluZycgfSxcbiAgICAgICAgeyBydW5JZDogJ3IyJywgd29ya2Zsb3dOYW1lOiAnd2YnLCBzdGF0dXM6ICdydW5uaW5nJyB9LFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgZXhpdENvZGUsIHJlc3VsdCB9ID0gYXdhaXQgcGVyZm9ybUJ1bGtDYW5jZWwoe1xuICAgICAgd29ybGQsXG4gICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgIGxpbWl0OiA1MCxcbiAgICAgIGNvbmZpcm06IHRydWUsXG4gICAgICBsb2dnZXIsXG4gICAgfSk7XG5cbiAgICBleHBlY3QoZXhpdENvZGUpLnRvQmUoMCk7XG4gICAgZXhwZWN0KHdvcmxkLmV2ZW50cy5jcmVhdGUgYXMgYW55KS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMik7XG4gICAgZXhwZWN0KHdvcmxkLmV2ZW50cy5jcmVhdGUgYXMgYW55KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICdyMScsXG4gICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgIGV2ZW50RGF0YTogeyBjYW5jZWxSZWFzb246IENMSV9DQU5DRUxfUkVBU09OIH0sXG4gICAgICB9KSxcbiAgICAgIGV4cGVjdC5hbnl0aGluZygpXG4gICAgKTtcbiAgICBleHBlY3QocmVzdWx0Py5zdW1tYXJ5LmNhbmNlbGxlZCkudG9CZSgyKTtcbiAgICBleHBlY3QobG9ncy5qb2luKCdcXG4nKSkudG9Db250YWluKCcyIGNhbmNlbGxlZCcpO1xuICB9KTtcblxuICBpdCgncHJpbnRzIHJlcnVuIGd1aWRhbmNlIHdoZW4gbW9yZSBydW5zIG1hdGNoIHRoYW4gd2VyZSBmZXRjaGVkJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgbG9nZ2VyLCB3YXJucyB9ID0gbWFrZUxvZ2dlcigpO1xuICAgIGNvbnN0IHdvcmxkID0gbWFrZVdvcmxkKHtcbiAgICAgIHJ1bnM6IFt7IHJ1bklkOiAncjEnLCB3b3JrZmxvd05hbWU6ICd3ZicsIHN0YXR1czogJ3J1bm5pbmcnIH1dLFxuICAgICAgaGFzTW9yZTogdHJ1ZSxcbiAgICAgIGNhbmNlbE1hbnk6IGFzeW5jICgpID0+ICh7XG4gICAgICAgIHN1bW1hcnk6IHtcbiAgICAgICAgICByZXF1ZXN0ZWQ6IDEsXG4gICAgICAgICAgY2FuY2VsbGVkOiAxLFxuICAgICAgICAgIGFscmVhZHlDYW5jZWxsZWQ6IDAsXG4gICAgICAgICAgbm90Q2FuY2VsbGFibGU6IDAsXG4gICAgICAgICAgbm90Rm91bmQ6IDAsXG4gICAgICAgICAgZmFpbGVkOiAwLFxuICAgICAgICB9LFxuICAgICAgICByZXN1bHRzOiBbeyBydW5JZDogJ3IxJywgb3V0Y29tZTogJ2NhbmNlbGxlZCcgfV0sXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIGF3YWl0IHBlcmZvcm1CdWxrQ2FuY2VsKHtcbiAgICAgIHdvcmxkLFxuICAgICAgc3RhdHVzOiAncnVubmluZycsXG4gICAgICBsaW1pdDogMSxcbiAgICAgIGNvbmZpcm06IHRydWUsXG4gICAgICBsb2dnZXIsXG4gICAgfSk7XG5cbiAgICBleHBlY3Qod2FybnMpLnRvQ29udGFpbihIQVNfTU9SRV9HVUlEQU5DRSk7XG4gIH0pO1xuXG4gIGl0KCdleGl0cyAxIGFuZCBzdXJmYWNlcyBwZXItcnVuIGZhaWx1cmVzIHdoZW4gYSBydW4gZmFpbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyBsb2dnZXIsIHdhcm5zIH0gPSBtYWtlTG9nZ2VyKCk7XG4gICAgY29uc3Qgd29ybGQgPSBtYWtlV29ybGQoe1xuICAgICAgcnVuczogW1xuICAgICAgICB7IHJ1bklkOiAncjEnLCB3b3JrZmxvd05hbWU6ICd3ZicsIHN0YXR1czogJ3J1bm5pbmcnIH0sXG4gICAgICAgIHsgcnVuSWQ6ICdyMicsIHdvcmtmbG93TmFtZTogJ3dmJywgc3RhdHVzOiAncnVubmluZycgfSxcbiAgICAgIF0sXG4gICAgICBjYW5jZWxNYW55OiBhc3luYyAoKSA9PiAoe1xuICAgICAgICBzdW1tYXJ5OiB7XG4gICAgICAgICAgcmVxdWVzdGVkOiAyLFxuICAgICAgICAgIGNhbmNlbGxlZDogMSxcbiAgICAgICAgICBhbHJlYWR5Q2FuY2VsbGVkOiAwLFxuICAgICAgICAgIG5vdENhbmNlbGxhYmxlOiAwLFxuICAgICAgICAgIG5vdEZvdW5kOiAwLFxuICAgICAgICAgIGZhaWxlZDogMSxcbiAgICAgICAgfSxcbiAgICAgICAgcmVzdWx0czogW1xuICAgICAgICAgIHsgcnVuSWQ6ICdyMScsIG91dGNvbWU6ICdjYW5jZWxsZWQnIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcnVuSWQ6ICdyMicsXG4gICAgICAgICAgICBvdXRjb21lOiAnZmFpbGVkJyxcbiAgICAgICAgICAgIGNvZGU6ICdpbnRlcm5hbF9lcnJvcicsXG4gICAgICAgICAgICByZXRyeWFibGU6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBleGl0Q29kZSB9ID0gYXdhaXQgcGVyZm9ybUJ1bGtDYW5jZWwoe1xuICAgICAgd29ybGQsXG4gICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgIGxpbWl0OiA1MCxcbiAgICAgIGNvbmZpcm06IHRydWUsXG4gICAgICBsb2dnZXIsXG4gICAgfSk7XG5cbiAgICBleHBlY3QoZXhpdENvZGUpLnRvQmUoMSk7XG4gICAgZXhwZWN0KHdhcm5zKS50b0NvbnRhaW4oJyAg4pyXIHIyOiBmYWlsZWQgKGludGVybmFsX2Vycm9yLCByZXRyeWFibGUpJyk7XG4gIH0pO1xuXG4gIGl0KCdhYm9ydHMgd2l0aG91dCBjYW5jZWxsaW5nIHdoZW4gY29uZmlybWF0aW9uIGlzIGRlY2xpbmVkJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgbG9nZ2VyLCBsb2dzIH0gPSBtYWtlTG9nZ2VyKCk7XG4gICAgY29uc3QgY2FuY2VsTWFueSA9IHZpLmZuKCk7XG4gICAgY29uc3Qgd29ybGQgPSBtYWtlV29ybGQoe1xuICAgICAgcnVuczogW3sgcnVuSWQ6ICdyMScsIHdvcmtmbG93TmFtZTogJ3dmJywgc3RhdHVzOiAncnVubmluZycgfV0sXG4gICAgICBjYW5jZWxNYW55OiBjYW5jZWxNYW55IGFzIGFueSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgZXhpdENvZGUgfSA9IGF3YWl0IHBlcmZvcm1CdWxrQ2FuY2VsKHtcbiAgICAgIHdvcmxkLFxuICAgICAgc3RhdHVzOiAncnVubmluZycsXG4gICAgICBsaW1pdDogNTAsXG4gICAgICBjb25maXJtOiBmYWxzZSxcbiAgICAgIGxvZ2dlcixcbiAgICAgIHByb21wdENvbmZpcm06IGFzeW5jICgpID0+IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KGV4aXRDb2RlKS50b0JlKDApO1xuICAgIGV4cGVjdChsb2dzKS50b0NvbnRhaW4oJ0Fib3J0ZWQuJyk7XG4gICAgZXhwZWN0KGNhbmNlbE1hbnkpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdwZXJmb3JtQnVsa0NhbmNlbCBhbmFseXRpY3Mgd2luZG93IHByb2JlJywgKCkgPT4ge1xuICBpdCgncHJvYmVzIHRoZSBwbGFuIHdpbmRvdyBvbmNlIGZvciB0aGUgd2hvbGUgc3RhdHVzIGZhbi1vdXQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgd2luZG93U3RhcnQgPSAnMjAyNi0wOC0wM1QwMDowMDowMC4wMDBaJztcbiAgICBjb25zdCBjYW5jZWxNYW55ID0gYXN5bmMgKFxuICAgICAgcmVxOiBCdWxrQ2FuY2VsV29ya2Zsb3dSdW5zUmVxdWVzdFxuICAgICk6IFByb21pc2U8QnVsa0NhbmNlbFdvcmtmbG93UnVuc1Jlc3VsdD4gPT4gKHtcbiAgICAgIHN1bW1hcnk6IHtcbiAgICAgICAgcmVxdWVzdGVkOiByZXEucnVuSWRzLmxlbmd0aCxcbiAgICAgICAgY2FuY2VsbGVkOiByZXEucnVuSWRzLmxlbmd0aCxcbiAgICAgICAgYWxyZWFkeUNhbmNlbGxlZDogMCxcbiAgICAgICAgbm90Q2FuY2VsbGFibGU6IDAsXG4gICAgICAgIG5vdEZvdW5kOiAwLFxuICAgICAgICBmYWlsZWQ6IDAsXG4gICAgICB9LFxuICAgICAgcmVzdWx0czogcmVxLnJ1bklkcy5tYXAoKHJ1bklkKSA9PiAoe1xuICAgICAgICBydW5JZCxcbiAgICAgICAgb3V0Y29tZTogJ2NhbmNlbGxlZCcgYXMgY29uc3QsXG4gICAgICB9KSksXG4gICAgfSk7XG4gICAgY29uc3Qgd29ybGQgPSBtYWtlV29ybGQoe1xuICAgICAgYW5hbHl0aWNzV2luZG93U3RhcnQ6IHdpbmRvd1N0YXJ0LFxuICAgICAgcnVuczogW1xuICAgICAgICB7IHJ1bklkOiAncDEnLCB3b3JrZmxvd05hbWU6ICd3ZicsIHN0YXR1czogJ3BlbmRpbmcnIH0sXG4gICAgICAgIHsgcnVuSWQ6ICdyMScsIHdvcmtmbG93TmFtZTogJ3dmJywgc3RhdHVzOiAncnVubmluZycgfSxcbiAgICAgIF0sXG4gICAgICBjYW5jZWxNYW55LFxuICAgIH0pO1xuICAgIGNvbnN0IHsgbG9nZ2VyIH0gPSBtYWtlTG9nZ2VyKCk7XG5cbiAgICBjb25zdCB7IGV4aXRDb2RlIH0gPSBhd2FpdCBwZXJmb3JtQnVsa0NhbmNlbCh7XG4gICAgICB3b3JsZCxcbiAgICAgIGxpbWl0OiA1MCxcbiAgICAgIGNvbmZpcm06IHRydWUsXG4gICAgICBsb2dnZXIsXG4gICAgfSk7XG5cbiAgICBleHBlY3QoZXhpdENvZGUpLnRvQmUoMCk7XG4gICAgY29uc3QgY2FsbHMgPSAod29ybGQuYW5hbHl0aWNzPy5ydW5zLmxpc3QgYXMgYW55KS5tb2NrLmNhbGxzLm1hcChcbiAgICAgIChcbiAgICAgICAgYzogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHN0YXR1cz86IHN0cmluZztcbiAgICAgICAgICAgIHN0YXJ0VGltZT86IHN0cmluZztcbiAgICAgICAgICAgIHBhZ2luYXRpb24/OiB7IGxpbWl0PzogbnVtYmVyIH07XG4gICAgICAgICAgfSxcbiAgICAgICAgXVxuICAgICAgKSA9PiBjWzBdXG4gICAgKTtcblxuICAgIC8vIEV4YWN0bHkgb25lIHByb2JlLCByZWdhcmRsZXNzIG9mIGhvdyBtYW55IHN0YXR1c2VzIGFyZSBmYW5uZWQgb3V0LlxuICAgIGNvbnN0IHByb2JlcyA9IGNhbGxzLmZpbHRlcihcbiAgICAgIChjOiB7IHBhZ2luYXRpb24/OiB7IGxpbWl0PzogbnVtYmVyIH0gfSkgPT4gYy5wYWdpbmF0aW9uPy5saW1pdCA9PT0gMVxuICAgICk7XG4gICAgZXhwZWN0KHByb2JlcykudG9IYXZlTGVuZ3RoKDEpO1xuXG4gICAgLy8gRXZlcnkgcmVhbCBsaXN0aW5nIGlzIGJvdW5kZWQgYnkgdGhlIHdpbmRvdyB0aGUgcHJvYmUgcmVzb2x2ZWQuXG4gICAgY29uc3QgbGlzdGluZ3MgPSBjYWxscy5maWx0ZXIoXG4gICAgICAoYzogeyBwYWdpbmF0aW9uPzogeyBsaW1pdD86IG51bWJlciB9IH0pID0+IGMucGFnaW5hdGlvbj8ubGltaXQgIT09IDFcbiAgICApO1xuICAgIGV4cGVjdChsaXN0aW5ncy5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigxKTtcbiAgICBmb3IgKGNvbnN0IGxpc3Rpbmcgb2YgbGlzdGluZ3MpIHtcbiAgICAgIGV4cGVjdChsaXN0aW5nLnN0YXJ0VGltZSkudG9CZSh3aW5kb3dTdGFydCk7XG4gICAgICBleHBlY3QobGlzdGluZy5lbmRUaW1lKS50b0JlRGVmaW5lZCgpO1xuICAgIH1cbiAgICAvLyBTdG9yYWdlIGlzIG5vdCBjb25zdWx0ZWQgd2hlbiBhbmFseXRpY3MgaXMgYXZhaWxhYmxlLlxuICAgIGV4cGVjdCh3b3JsZC5ydW5zLmxpc3QpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -12,7 +12,12 @@ export type InspectCLIOptions = {
12
12
  limit?: number;
13
13
  workflowName?: string;
14
14
  status?: WorkflowRunStatus;
15
- /** Listing window start: relative duration (12h, 7d) or timestamp (runs only) */
15
+ /** Attribute prefilter for run listings, from repeated `--attribute k=v` */
16
+ attributes?: Record<string, string>;
17
+ /**
18
+ * Listing window start: relative duration (12h, 7d) or timestamp.
19
+ * Applies to the runs and attribute-key listings.
20
+ */
16
21
  since?: string;
17
22
  /** Listing window end: relative duration or timestamp; requires --since */
18
23
  until?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/config/types.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,YAAY,EACV,WAAW,EACX,cAAc,GACf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gFAAgF;IAChF,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/config/types.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,YAAY,EACV,WAAW,EACX,cAAc,GACf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,4EAA4E;IAC5E,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gFAAgF;IAChF,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC"}
@@ -1,2 +1,2 @@
1
1
  export { isValidBuildTarget, validBuildTargets, } from '@workflow/builders';
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2NvbmZpZy90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFPQSxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLGlCQUFpQixHQUNsQixNQUFNLG9CQUFvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gUmUtZXhwb3J0IGJ1aWxkZXIgdHlwZXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93UnVuU3RhdHVzIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcblxuZXhwb3J0IHR5cGUge1xuICBCdWlsZFRhcmdldCxcbiAgV29ya2Zsb3dDb25maWcsXG59IGZyb20gJ0B3b3JrZmxvdy9idWlsZGVycyc7XG5leHBvcnQge1xuICBpc1ZhbGlkQnVpbGRUYXJnZXQsXG4gIHZhbGlkQnVpbGRUYXJnZXRzLFxufSBmcm9tICdAd29ya2Zsb3cvYnVpbGRlcnMnO1xuXG5leHBvcnQgdHlwZSBJbnNwZWN0Q0xJT3B0aW9ucyA9IHtcbiAganNvbj86IGJvb2xlYW47XG4gIHdhdGNoPzogYm9vbGVhbjtcbiAgcnVuSWQ/OiBzdHJpbmc7XG4gIHN0ZXBJZD86IHN0cmluZztcbiAgaG9va0lkPzogc3RyaW5nO1xuICBjdXJzb3I/OiBzdHJpbmc7XG4gIHNvcnQ/OiAnYXNjJyB8ICdkZXNjJztcbiAgbGltaXQ/OiBudW1iZXI7XG4gIHdvcmtmbG93TmFtZT86IHN0cmluZztcbiAgc3RhdHVzPzogV29ya2Zsb3dSdW5TdGF0dXM7XG4gIC8qKiBMaXN0aW5nIHdpbmRvdyBzdGFydDogcmVsYXRpdmUgZHVyYXRpb24gKDEyaCwgN2QpIG9yIHRpbWVzdGFtcCAocnVucyBvbmx5KSAqL1xuICBzaW5jZT86IHN0cmluZztcbiAgLyoqIExpc3Rpbmcgd2luZG93IGVuZDogcmVsYXRpdmUgZHVyYXRpb24gb3IgdGltZXN0YW1wOyByZXF1aXJlcyAtLXNpbmNlICovXG4gIHVudGlsPzogc3RyaW5nO1xuICB3aXRoRGF0YT86IGJvb2xlYW47XG4gIGJhY2tlbmQ/OiBzdHJpbmc7XG4gIGRpc2FibGVSZWxhdGl2ZURhdGVzPzogYm9vbGVhbjtcbiAgaW50ZXJhY3RpdmU/OiBib29sZWFuO1xuICAvKiogV2hlbiB0cnVlLCBkZWNyeXB0IGVuY3J5cHRlZCB2YWx1ZXMgKHRyaWdnZXJzIGF1ZGl0LWxvZ2dlZCBrZXkgcmV0cmlldmFsKSAqL1xuICBkZWNyeXB0PzogYm9vbGVhbjtcbn07XG4iXX0=
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2NvbmZpZy90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFPQSxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLGlCQUFpQixHQUNsQixNQUFNLG9CQUFvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gUmUtZXhwb3J0IGJ1aWxkZXIgdHlwZXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93UnVuU3RhdHVzIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcblxuZXhwb3J0IHR5cGUge1xuICBCdWlsZFRhcmdldCxcbiAgV29ya2Zsb3dDb25maWcsXG59IGZyb20gJ0B3b3JrZmxvdy9idWlsZGVycyc7XG5leHBvcnQge1xuICBpc1ZhbGlkQnVpbGRUYXJnZXQsXG4gIHZhbGlkQnVpbGRUYXJnZXRzLFxufSBmcm9tICdAd29ya2Zsb3cvYnVpbGRlcnMnO1xuXG5leHBvcnQgdHlwZSBJbnNwZWN0Q0xJT3B0aW9ucyA9IHtcbiAganNvbj86IGJvb2xlYW47XG4gIHdhdGNoPzogYm9vbGVhbjtcbiAgcnVuSWQ/OiBzdHJpbmc7XG4gIHN0ZXBJZD86IHN0cmluZztcbiAgaG9va0lkPzogc3RyaW5nO1xuICBjdXJzb3I/OiBzdHJpbmc7XG4gIHNvcnQ/OiAnYXNjJyB8ICdkZXNjJztcbiAgbGltaXQ/OiBudW1iZXI7XG4gIHdvcmtmbG93TmFtZT86IHN0cmluZztcbiAgc3RhdHVzPzogV29ya2Zsb3dSdW5TdGF0dXM7XG4gIC8qKiBBdHRyaWJ1dGUgcHJlZmlsdGVyIGZvciBydW4gbGlzdGluZ3MsIGZyb20gcmVwZWF0ZWQgYC0tYXR0cmlidXRlIGs9dmAgKi9cbiAgYXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIC8qKlxuICAgKiBMaXN0aW5nIHdpbmRvdyBzdGFydDogcmVsYXRpdmUgZHVyYXRpb24gKDEyaCwgN2QpIG9yIHRpbWVzdGFtcC5cbiAgICogQXBwbGllcyB0byB0aGUgcnVucyBhbmQgYXR0cmlidXRlLWtleSBsaXN0aW5ncy5cbiAgICovXG4gIHNpbmNlPzogc3RyaW5nO1xuICAvKiogTGlzdGluZyB3aW5kb3cgZW5kOiByZWxhdGl2ZSBkdXJhdGlvbiBvciB0aW1lc3RhbXA7IHJlcXVpcmVzIC0tc2luY2UgKi9cbiAgdW50aWw/OiBzdHJpbmc7XG4gIHdpdGhEYXRhPzogYm9vbGVhbjtcbiAgYmFja2VuZD86IHN0cmluZztcbiAgZGlzYWJsZVJlbGF0aXZlRGF0ZXM/OiBib29sZWFuO1xuICBpbnRlcmFjdGl2ZT86IGJvb2xlYW47XG4gIC8qKiBXaGVuIHRydWUsIGRlY3J5cHQgZW5jcnlwdGVkIHZhbHVlcyAodHJpZ2dlcnMgYXVkaXQtbG9nZ2VkIGtleSByZXRyaWV2YWwpICovXG4gIGRlY3J5cHQ/OiBib29sZWFuO1xufTtcbiJdfQ==
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Parse repeated `--attribute key=value` flags into the filter the analytics
3
+ * runs listing takes.
4
+ *
5
+ * Bounds are checked here as well as in the World so the message names the
6
+ * flag the user typed rather than the parameter it becomes. Only the first
7
+ * `=` splits, since an attribute value may contain one. An empty value is
8
+ * meaningful — it matches runs whose attribute was set to the empty string —
9
+ * so only an empty key is rejected. A key given twice is rejected rather
10
+ * than resolved: matching is per-key, so one of the two values would have to
11
+ * be discarded, and silently picking either would answer a question the
12
+ * caller did not ask.
13
+ */
14
+ export declare function parseAttributeFilters(values: string[] | undefined): Record<string, string> | undefined;
15
+ //# sourceMappingURL=attribute-filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attribute-filter.d.ts","sourceRoot":"","sources":["../../../src/lib/inspect/attribute-filter.ts"],"names":[],"mappings":"AAaA;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,GAC3B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CA6BpC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Cap on `--attribute` flags, mirroring the bound the backend applies to an
3
+ * attribute prefilter.
4
+ *
5
+ * `@workflow/world` exports the same value as
6
+ * `ANALYTICS_MAX_ATTRIBUTE_FILTERS` and `@workflow/world-vercel` asserts it,
7
+ * so this copy is not the authority. It exists only so the error can name
8
+ * the flag the user typed rather than the parameter it becomes, and is kept
9
+ * local so the command does not fail to build against a World that predates
10
+ * that export.
11
+ */
12
+ const MAX_ATTRIBUTE_FLAGS = 8;
13
+ /**
14
+ * Parse repeated `--attribute key=value` flags into the filter the analytics
15
+ * runs listing takes.
16
+ *
17
+ * Bounds are checked here as well as in the World so the message names the
18
+ * flag the user typed rather than the parameter it becomes. Only the first
19
+ * `=` splits, since an attribute value may contain one. An empty value is
20
+ * meaningful — it matches runs whose attribute was set to the empty string —
21
+ * so only an empty key is rejected. A key given twice is rejected rather
22
+ * than resolved: matching is per-key, so one of the two values would have to
23
+ * be discarded, and silently picking either would answer a question the
24
+ * caller did not ask.
25
+ */
26
+ export function parseAttributeFilters(values) {
27
+ if (!values?.length)
28
+ return undefined;
29
+ if (values.length > MAX_ATTRIBUTE_FLAGS) {
30
+ throw new Error(`--attribute may be given at most ${MAX_ATTRIBUTE_FLAGS} times (received ${values.length})`);
31
+ }
32
+ // Null-prototype, so an attribute key that happens to name an
33
+ // `Object.prototype` member is an ordinary key. On a plain object literal
34
+ // `'toString' in attributes` is true before anything is stored, which
35
+ // rejected such a key as a duplicate on first sight, and assigning
36
+ // `__proto__` would have set the prototype instead of storing a value.
37
+ const attributes = Object.create(null);
38
+ for (const value of values) {
39
+ const separator = value.indexOf('=');
40
+ if (separator < 1) {
41
+ throw new Error(`--attribute must be key=value, received ${JSON.stringify(value)}`);
42
+ }
43
+ const key = value.slice(0, separator);
44
+ if (Object.hasOwn(attributes, key)) {
45
+ throw new Error(`--attribute ${JSON.stringify(key)} was given more than once; a run matches one value per key`);
46
+ }
47
+ attributes[key] = value.slice(separator + 1);
48
+ }
49
+ return attributes;
50
+ }
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0cmlidXRlLWZpbHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvaW5zcGVjdC9hdHRyaWJ1dGUtZmlsdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLG1CQUFtQixHQUFHLENBQUMsQ0FBQztBQUU5Qjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQ25DLE1BQTRCO0lBRTVCLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ3RDLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxtQkFBbUIsRUFBRSxDQUFDO1FBQ3hDLE1BQU0sSUFBSSxLQUFLLENBQ2Isb0NBQW9DLG1CQUFtQixvQkFBb0IsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUM1RixDQUFDO0lBQ0osQ0FBQztJQUNELDhEQUE4RDtJQUM5RCwwRUFBMEU7SUFDMUUsc0VBQXNFO0lBQ3RFLG1FQUFtRTtJQUNuRSx1RUFBdUU7SUFDdkUsTUFBTSxVQUFVLEdBQTJCLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0QsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUMzQixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDLElBQUksU0FBUyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2xCLE1BQU0sSUFBSSxLQUFLLENBQ2IsMkNBQTJDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FDbkUsQ0FBQztRQUNKLENBQUM7UUFDRCxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN0QyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FDYixlQUFlLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLDREQUE0RCxDQUMvRixDQUFDO1FBQ0osQ0FBQztRQUNELFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBQ0QsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ2FwIG9uIGAtLWF0dHJpYnV0ZWAgZmxhZ3MsIG1pcnJvcmluZyB0aGUgYm91bmQgdGhlIGJhY2tlbmQgYXBwbGllcyB0byBhblxuICogYXR0cmlidXRlIHByZWZpbHRlci5cbiAqXG4gKiBgQHdvcmtmbG93L3dvcmxkYCBleHBvcnRzIHRoZSBzYW1lIHZhbHVlIGFzXG4gKiBgQU5BTFlUSUNTX01BWF9BVFRSSUJVVEVfRklMVEVSU2AgYW5kIGBAd29ya2Zsb3cvd29ybGQtdmVyY2VsYCBhc3NlcnRzIGl0LFxuICogc28gdGhpcyBjb3B5IGlzIG5vdCB0aGUgYXV0aG9yaXR5LiBJdCBleGlzdHMgb25seSBzbyB0aGUgZXJyb3IgY2FuIG5hbWVcbiAqIHRoZSBmbGFnIHRoZSB1c2VyIHR5cGVkIHJhdGhlciB0aGFuIHRoZSBwYXJhbWV0ZXIgaXQgYmVjb21lcywgYW5kIGlzIGtlcHRcbiAqIGxvY2FsIHNvIHRoZSBjb21tYW5kIGRvZXMgbm90IGZhaWwgdG8gYnVpbGQgYWdhaW5zdCBhIFdvcmxkIHRoYXQgcHJlZGF0ZXNcbiAqIHRoYXQgZXhwb3J0LlxuICovXG5jb25zdCBNQVhfQVRUUklCVVRFX0ZMQUdTID0gODtcblxuLyoqXG4gKiBQYXJzZSByZXBlYXRlZCBgLS1hdHRyaWJ1dGUga2V5PXZhbHVlYCBmbGFncyBpbnRvIHRoZSBmaWx0ZXIgdGhlIGFuYWx5dGljc1xuICogcnVucyBsaXN0aW5nIHRha2VzLlxuICpcbiAqIEJvdW5kcyBhcmUgY2hlY2tlZCBoZXJlIGFzIHdlbGwgYXMgaW4gdGhlIFdvcmxkIHNvIHRoZSBtZXNzYWdlIG5hbWVzIHRoZVxuICogZmxhZyB0aGUgdXNlciB0eXBlZCByYXRoZXIgdGhhbiB0aGUgcGFyYW1ldGVyIGl0IGJlY29tZXMuIE9ubHkgdGhlIGZpcnN0XG4gKiBgPWAgc3BsaXRzLCBzaW5jZSBhbiBhdHRyaWJ1dGUgdmFsdWUgbWF5IGNvbnRhaW4gb25lLiBBbiBlbXB0eSB2YWx1ZSBpc1xuICogbWVhbmluZ2Z1bCDigJQgaXQgbWF0Y2hlcyBydW5zIHdob3NlIGF0dHJpYnV0ZSB3YXMgc2V0IHRvIHRoZSBlbXB0eSBzdHJpbmcg4oCUXG4gKiBzbyBvbmx5IGFuIGVtcHR5IGtleSBpcyByZWplY3RlZC4gQSBrZXkgZ2l2ZW4gdHdpY2UgaXMgcmVqZWN0ZWQgcmF0aGVyXG4gKiB0aGFuIHJlc29sdmVkOiBtYXRjaGluZyBpcyBwZXIta2V5LCBzbyBvbmUgb2YgdGhlIHR3byB2YWx1ZXMgd291bGQgaGF2ZSB0b1xuICogYmUgZGlzY2FyZGVkLCBhbmQgc2lsZW50bHkgcGlja2luZyBlaXRoZXIgd291bGQgYW5zd2VyIGEgcXVlc3Rpb24gdGhlXG4gKiBjYWxsZXIgZGlkIG5vdCBhc2suXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUF0dHJpYnV0ZUZpbHRlcnMoXG4gIHZhbHVlczogc3RyaW5nW10gfCB1bmRlZmluZWRcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQge1xuICBpZiAoIXZhbHVlcz8ubGVuZ3RoKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodmFsdWVzLmxlbmd0aCA+IE1BWF9BVFRSSUJVVEVfRkxBR1MpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgLS1hdHRyaWJ1dGUgbWF5IGJlIGdpdmVuIGF0IG1vc3QgJHtNQVhfQVRUUklCVVRFX0ZMQUdTfSB0aW1lcyAocmVjZWl2ZWQgJHt2YWx1ZXMubGVuZ3RofSlgXG4gICAgKTtcbiAgfVxuICAvLyBOdWxsLXByb3RvdHlwZSwgc28gYW4gYXR0cmlidXRlIGtleSB0aGF0IGhhcHBlbnMgdG8gbmFtZSBhblxuICAvLyBgT2JqZWN0LnByb3RvdHlwZWAgbWVtYmVyIGlzIGFuIG9yZGluYXJ5IGtleS4gT24gYSBwbGFpbiBvYmplY3QgbGl0ZXJhbFxuICAvLyBgJ3RvU3RyaW5nJyBpbiBhdHRyaWJ1dGVzYCBpcyB0cnVlIGJlZm9yZSBhbnl0aGluZyBpcyBzdG9yZWQsIHdoaWNoXG4gIC8vIHJlamVjdGVkIHN1Y2ggYSBrZXkgYXMgYSBkdXBsaWNhdGUgb24gZmlyc3Qgc2lnaHQsIGFuZCBhc3NpZ25pbmdcbiAgLy8gYF9fcHJvdG9fX2Agd291bGQgaGF2ZSBzZXQgdGhlIHByb3RvdHlwZSBpbnN0ZWFkIG9mIHN0b3JpbmcgYSB2YWx1ZS5cbiAgY29uc3QgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgY29uc3Qgc2VwYXJhdG9yID0gdmFsdWUuaW5kZXhPZignPScpO1xuICAgIGlmIChzZXBhcmF0b3IgPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAtLWF0dHJpYnV0ZSBtdXN0IGJlIGtleT12YWx1ZSwgcmVjZWl2ZWQgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qga2V5ID0gdmFsdWUuc2xpY2UoMCwgc2VwYXJhdG9yKTtcbiAgICBpZiAoT2JqZWN0Lmhhc093bihhdHRyaWJ1dGVzLCBrZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAtLWF0dHJpYnV0ZSAke0pTT04uc3RyaW5naWZ5KGtleSl9IHdhcyBnaXZlbiBtb3JlIHRoYW4gb25jZTsgYSBydW4gbWF0Y2hlcyBvbmUgdmFsdWUgcGVyIGtleWBcbiAgICAgICk7XG4gICAgfVxuICAgIGF0dHJpYnV0ZXNba2V5XSA9IHZhbHVlLnNsaWNlKHNlcGFyYXRvciArIDEpO1xuICB9XG4gIHJldHVybiBhdHRyaWJ1dGVzO1xufVxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=attribute-filter.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attribute-filter.test.d.ts","sourceRoot":"","sources":["../../../src/lib/inspect/attribute-filter.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,65 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { parseAttributeFilters } from './attribute-filter.js';
3
+ describe('parseAttributeFilters', () => {
4
+ it('is undefined when the flag is absent or empty', () => {
5
+ expect(parseAttributeFilters(undefined)).toBeUndefined();
6
+ expect(parseAttributeFilters([])).toBeUndefined();
7
+ });
8
+ it('collects repeated pairs', () => {
9
+ expect(parseAttributeFilters(['application=next-benchmarks', 'tenant=acme'])).toEqual({ application: 'next-benchmarks', tenant: 'acme' });
10
+ });
11
+ // Attribute values are arbitrary user strings and may contain '='.
12
+ it('splits on the first separator only', () => {
13
+ expect(parseAttributeFilters(['url=https://x.test/?a=1&b=2'])).toEqual({
14
+ url: 'https://x.test/?a=1&b=2',
15
+ });
16
+ });
17
+ // Matches runs whose attribute was explicitly set to the empty string,
18
+ // which is different from not filtering at all.
19
+ it('keeps an empty value', () => {
20
+ expect(parseAttributeFilters(['tenant='])).toEqual({ tenant: '' });
21
+ });
22
+ it('accepts reserved $-prefixed keys, which are filterable', () => {
23
+ expect(parseAttributeFilters(['$parentRunId=wrun_1'])).toEqual({
24
+ $parentRunId: 'wrun_1',
25
+ });
26
+ });
27
+ it.each([
28
+ ['no separator', 'tenant'],
29
+ ['empty key', '=acme'],
30
+ ])('rejects %s', (_label, value) => {
31
+ expect(() => parseAttributeFilters([value])).toThrow('--attribute must be key=value');
32
+ });
33
+ it('rejects more pairs than the backend accepts, naming the flag', () => {
34
+ const nine = Array.from({ length: 9 }, (_, i) => `k${i}=v`);
35
+ expect(() => parseAttributeFilters(nine)).toThrow('--attribute may be given at most 8 times (received 9)');
36
+ });
37
+ // Matching is per-key, so resolving this would mean discarding one of two
38
+ // filters the caller typed.
39
+ it('rejects a repeated key rather than picking one value', () => {
40
+ expect(() => parseAttributeFilters(['tenant=a', 'tenant=b'])).toThrow('--attribute "tenant" was given more than once');
41
+ });
42
+ // On a plain object literal these are truthy for `in` before anything is
43
+ // stored, so each was rejected as a duplicate on first sight; `__proto__`
44
+ // would additionally have set the prototype instead of storing a value.
45
+ it.each([
46
+ 'toString',
47
+ 'constructor',
48
+ 'hasOwnProperty',
49
+ '__proto__',
50
+ ])('accepts %s as an ordinary key', (key) => {
51
+ const parsed = parseAttributeFilters([`${key}=v`]);
52
+ expect(Object.hasOwn(parsed ?? {}, key)).toBe(true);
53
+ expect(parsed[key]).toBe('v');
54
+ });
55
+ it('still rejects a prototype-named key given twice', () => {
56
+ expect(() => parseAttributeFilters(['toString=a', 'toString=b'])).toThrow('was given more than once');
57
+ });
58
+ it('allows the same value under different keys', () => {
59
+ expect(parseAttributeFilters(['tenant=a', 'region=a'])).toEqual({
60
+ tenant: 'a',
61
+ region: 'a',
62
+ });
63
+ });
64
+ });
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0cmlidXRlLWZpbHRlci50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9pbnNwZWN0L2F0dHJpYnV0ZS1maWx0ZXIudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDOUMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFOUQsUUFBUSxDQUFDLHVCQUF1QixFQUFFLEdBQUcsRUFBRTtJQUNyQyxFQUFFLENBQUMsK0NBQStDLEVBQUUsR0FBRyxFQUFFO1FBQ3ZELE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3pELE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3BELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHlCQUF5QixFQUFFLEdBQUcsRUFBRTtRQUNqQyxNQUFNLENBQ0oscUJBQXFCLENBQUMsQ0FBQyw2QkFBNkIsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUN0RSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNoRSxDQUFDLENBQUMsQ0FBQztJQUVILG1FQUFtRTtJQUNuRSxFQUFFLENBQUMsb0NBQW9DLEVBQUUsR0FBRyxFQUFFO1FBQzVDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUNyRSxHQUFHLEVBQUUseUJBQXlCO1NBQy9CLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsdUVBQXVFO0lBQ3ZFLGdEQUFnRDtJQUNoRCxFQUFFLENBQUMsc0JBQXNCLEVBQUUsR0FBRyxFQUFFO1FBQzlCLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNyRSxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyx3REFBd0QsRUFBRSxHQUFHLEVBQUU7UUFDaEUsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1lBQzdELFlBQVksRUFBRSxRQUFRO1NBQ3ZCLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLElBQUksQ0FBQztRQUNOLENBQUMsY0FBYyxFQUFFLFFBQVEsQ0FBQztRQUMxQixDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUM7S0FDdkIsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUNqQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMscUJBQXFCLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUNsRCwrQkFBK0IsQ0FDaEMsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDhEQUE4RCxFQUFFLEdBQUcsRUFBRTtRQUN0RSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVELE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FDL0MsdURBQXVELENBQ3hELENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztJQUVILDBFQUEwRTtJQUMxRSw0QkFBNEI7SUFDNUIsRUFBRSxDQUFDLHNEQUFzRCxFQUFFLEdBQUcsRUFBRTtRQUM5RCxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMscUJBQXFCLENBQUMsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FDbkUsK0NBQStDLENBQ2hELENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztJQUVILHlFQUF5RTtJQUN6RSwwRUFBMEU7SUFDMUUsd0VBQXdFO0lBQ3hFLEVBQUUsQ0FBQyxJQUFJLENBQUM7UUFDTixVQUFVO1FBQ1YsYUFBYTtRQUNiLGdCQUFnQjtRQUNoQixXQUFXO0tBQ1osQ0FBQyxDQUFDLCtCQUErQixFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7UUFDMUMsTUFBTSxNQUFNLEdBQUcscUJBQXFCLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNuRCxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BELE1BQU0sQ0FBRSxNQUFpQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzVELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLGlEQUFpRCxFQUFFLEdBQUcsRUFBRTtRQUN6RCxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMscUJBQXFCLENBQUMsQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FDdkUsMEJBQTBCLENBQzNCLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw0Q0FBNEMsRUFBRSxHQUFHLEVBQUU7UUFDcEQsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFDOUQsTUFBTSxFQUFFLEdBQUc7WUFDWCxNQUFNLEVBQUUsR0FBRztTQUNaLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZXNjcmliZSwgZXhwZWN0LCBpdCB9IGZyb20gJ3ZpdGVzdCc7XG5pbXBvcnQgeyBwYXJzZUF0dHJpYnV0ZUZpbHRlcnMgfSBmcm9tICcuL2F0dHJpYnV0ZS1maWx0ZXIuanMnO1xuXG5kZXNjcmliZSgncGFyc2VBdHRyaWJ1dGVGaWx0ZXJzJywgKCkgPT4ge1xuICBpdCgnaXMgdW5kZWZpbmVkIHdoZW4gdGhlIGZsYWcgaXMgYWJzZW50IG9yIGVtcHR5JywgKCkgPT4ge1xuICAgIGV4cGVjdChwYXJzZUF0dHJpYnV0ZUZpbHRlcnModW5kZWZpbmVkKSkudG9CZVVuZGVmaW5lZCgpO1xuICAgIGV4cGVjdChwYXJzZUF0dHJpYnV0ZUZpbHRlcnMoW10pKS50b0JlVW5kZWZpbmVkKCk7XG4gIH0pO1xuXG4gIGl0KCdjb2xsZWN0cyByZXBlYXRlZCBwYWlycycsICgpID0+IHtcbiAgICBleHBlY3QoXG4gICAgICBwYXJzZUF0dHJpYnV0ZUZpbHRlcnMoWydhcHBsaWNhdGlvbj1uZXh0LWJlbmNobWFya3MnLCAndGVuYW50PWFjbWUnXSlcbiAgICApLnRvRXF1YWwoeyBhcHBsaWNhdGlvbjogJ25leHQtYmVuY2htYXJrcycsIHRlbmFudDogJ2FjbWUnIH0pO1xuICB9KTtcblxuICAvLyBBdHRyaWJ1dGUgdmFsdWVzIGFyZSBhcmJpdHJhcnkgdXNlciBzdHJpbmdzIGFuZCBtYXkgY29udGFpbiAnPScuXG4gIGl0KCdzcGxpdHMgb24gdGhlIGZpcnN0IHNlcGFyYXRvciBvbmx5JywgKCkgPT4ge1xuICAgIGV4cGVjdChwYXJzZUF0dHJpYnV0ZUZpbHRlcnMoWyd1cmw9aHR0cHM6Ly94LnRlc3QvP2E9MSZiPTInXSkpLnRvRXF1YWwoe1xuICAgICAgdXJsOiAnaHR0cHM6Ly94LnRlc3QvP2E9MSZiPTInLFxuICAgIH0pO1xuICB9KTtcblxuICAvLyBNYXRjaGVzIHJ1bnMgd2hvc2UgYXR0cmlidXRlIHdhcyBleHBsaWNpdGx5IHNldCB0byB0aGUgZW1wdHkgc3RyaW5nLFxuICAvLyB3aGljaCBpcyBkaWZmZXJlbnQgZnJvbSBub3QgZmlsdGVyaW5nIGF0IGFsbC5cbiAgaXQoJ2tlZXBzIGFuIGVtcHR5IHZhbHVlJywgKCkgPT4ge1xuICAgIGV4cGVjdChwYXJzZUF0dHJpYnV0ZUZpbHRlcnMoWyd0ZW5hbnQ9J10pKS50b0VxdWFsKHsgdGVuYW50OiAnJyB9KTtcbiAgfSk7XG5cbiAgaXQoJ2FjY2VwdHMgcmVzZXJ2ZWQgJC1wcmVmaXhlZCBrZXlzLCB3aGljaCBhcmUgZmlsdGVyYWJsZScsICgpID0+IHtcbiAgICBleHBlY3QocGFyc2VBdHRyaWJ1dGVGaWx0ZXJzKFsnJHBhcmVudFJ1bklkPXdydW5fMSddKSkudG9FcXVhbCh7XG4gICAgICAkcGFyZW50UnVuSWQ6ICd3cnVuXzEnLFxuICAgIH0pO1xuICB9KTtcblxuICBpdC5lYWNoKFtcbiAgICBbJ25vIHNlcGFyYXRvcicsICd0ZW5hbnQnXSxcbiAgICBbJ2VtcHR5IGtleScsICc9YWNtZSddLFxuICBdKSgncmVqZWN0cyAlcycsIChfbGFiZWwsIHZhbHVlKSA9PiB7XG4gICAgZXhwZWN0KCgpID0+IHBhcnNlQXR0cmlidXRlRmlsdGVycyhbdmFsdWVdKSkudG9UaHJvdyhcbiAgICAgICctLWF0dHJpYnV0ZSBtdXN0IGJlIGtleT12YWx1ZSdcbiAgICApO1xuICB9KTtcblxuICBpdCgncmVqZWN0cyBtb3JlIHBhaXJzIHRoYW4gdGhlIGJhY2tlbmQgYWNjZXB0cywgbmFtaW5nIHRoZSBmbGFnJywgKCkgPT4ge1xuICAgIGNvbnN0IG5pbmUgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiA5IH0sIChfLCBpKSA9PiBgayR7aX09dmApO1xuICAgIGV4cGVjdCgoKSA9PiBwYXJzZUF0dHJpYnV0ZUZpbHRlcnMobmluZSkpLnRvVGhyb3coXG4gICAgICAnLS1hdHRyaWJ1dGUgbWF5IGJlIGdpdmVuIGF0IG1vc3QgOCB0aW1lcyAocmVjZWl2ZWQgOSknXG4gICAgKTtcbiAgfSk7XG5cbiAgLy8gTWF0Y2hpbmcgaXMgcGVyLWtleSwgc28gcmVzb2x2aW5nIHRoaXMgd291bGQgbWVhbiBkaXNjYXJkaW5nIG9uZSBvZiB0d29cbiAgLy8gZmlsdGVycyB0aGUgY2FsbGVyIHR5cGVkLlxuICBpdCgncmVqZWN0cyBhIHJlcGVhdGVkIGtleSByYXRoZXIgdGhhbiBwaWNraW5nIG9uZSB2YWx1ZScsICgpID0+IHtcbiAgICBleHBlY3QoKCkgPT4gcGFyc2VBdHRyaWJ1dGVGaWx0ZXJzKFsndGVuYW50PWEnLCAndGVuYW50PWInXSkpLnRvVGhyb3coXG4gICAgICAnLS1hdHRyaWJ1dGUgXCJ0ZW5hbnRcIiB3YXMgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UnXG4gICAgKTtcbiAgfSk7XG5cbiAgLy8gT24gYSBwbGFpbiBvYmplY3QgbGl0ZXJhbCB0aGVzZSBhcmUgdHJ1dGh5IGZvciBgaW5gIGJlZm9yZSBhbnl0aGluZyBpc1xuICAvLyBzdG9yZWQsIHNvIGVhY2ggd2FzIHJlamVjdGVkIGFzIGEgZHVwbGljYXRlIG9uIGZpcnN0IHNpZ2h0OyBgX19wcm90b19fYFxuICAvLyB3b3VsZCBhZGRpdGlvbmFsbHkgaGF2ZSBzZXQgdGhlIHByb3RvdHlwZSBpbnN0ZWFkIG9mIHN0b3JpbmcgYSB2YWx1ZS5cbiAgaXQuZWFjaChbXG4gICAgJ3RvU3RyaW5nJyxcbiAgICAnY29uc3RydWN0b3InLFxuICAgICdoYXNPd25Qcm9wZXJ0eScsXG4gICAgJ19fcHJvdG9fXycsXG4gIF0pKCdhY2NlcHRzICVzIGFzIGFuIG9yZGluYXJ5IGtleScsIChrZXkpID0+IHtcbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUF0dHJpYnV0ZUZpbHRlcnMoW2Ake2tleX09dmBdKTtcbiAgICBleHBlY3QoT2JqZWN0Lmhhc093bihwYXJzZWQgPz8ge30sIGtleSkpLnRvQmUodHJ1ZSk7XG4gICAgZXhwZWN0KChwYXJzZWQgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPilba2V5XSkudG9CZSgndicpO1xuICB9KTtcblxuICBpdCgnc3RpbGwgcmVqZWN0cyBhIHByb3RvdHlwZS1uYW1lZCBrZXkgZ2l2ZW4gdHdpY2UnLCAoKSA9PiB7XG4gICAgZXhwZWN0KCgpID0+IHBhcnNlQXR0cmlidXRlRmlsdGVycyhbJ3RvU3RyaW5nPWEnLCAndG9TdHJpbmc9YiddKSkudG9UaHJvdyhcbiAgICAgICd3YXMgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UnXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ2FsbG93cyB0aGUgc2FtZSB2YWx1ZSB1bmRlciBkaWZmZXJlbnQga2V5cycsICgpID0+IHtcbiAgICBleHBlY3QocGFyc2VBdHRyaWJ1dGVGaWx0ZXJzKFsndGVuYW50PWEnLCAncmVnaW9uPWEnXSkpLnRvRXF1YWwoe1xuICAgICAgdGVuYW50OiAnYScsXG4gICAgICByZWdpb246ICdhJyxcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -1,3 +1,31 @@
1
1
  export declare const isObservabilityUpgradeRequiredError: (error: unknown) => boolean;
2
2
  export declare const getObservabilityUpgradeRequiredMessage: () => string;
3
+ /**
4
+ * True for a client-side argument rejection from the World
5
+ * (`code: 'INVALID_ARGUMENT'`).
6
+ *
7
+ * These carry no HTTP status because no request was made, which is exactly
8
+ * why they need naming: status-based branches let them fall through to be
9
+ * rethrown as an unhandled exception, which prints nothing.
10
+ */
11
+ export declare const isInvalidArgumentError: (error: unknown) => boolean;
12
+ export declare const errorMessage: (error: unknown) => string;
13
+ export declare const checkAndHandleVercelAccessError: (error: unknown, backend?: string) => boolean;
14
+ /**
15
+ * Report the error classes that are actionable whichever read path produced
16
+ * them: a project-access failure, a plan gate, or an argument the World
17
+ * rejected locally. Returns true when one matched and was logged.
18
+ *
19
+ * Three callers need exactly this set, for the same reason in each case —
20
+ * the message names something the caller can fix, so swallowing it or
21
+ * retrying past it replaces an actionable error with a silent one:
22
+ *
23
+ * - `handleApiError` composes it with its HTTP-status arms;
24
+ * - `listSleeps` uses it alone, to decide what it must report rather than
25
+ * degrade to the event log;
26
+ * - `workflow cancel` uses it alone, having no fallback at all.
27
+ *
28
+ * One definition rather than three, so the set cannot drift between them.
29
+ */
30
+ export declare const reportActionableApiError: (error: unknown, backend?: string) => boolean;
3
31
  //# sourceMappingURL=errors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/lib/inspect/errors.ts"],"names":[],"mappings":"AAsBA,eAAO,MAAM,mCAAmC,GAC9C,OAAO,OAAO,KACb,OAUF,CAAC;AAEF,eAAO,MAAM,sCAAsC,QAAO,MAClB,CAAC"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/lib/inspect/errors.ts"],"names":[],"mappings":"AAyBA,eAAO,MAAM,mCAAmC,GAC9C,OAAO,OAAO,KACb,OAUF,CAAC;AAEF,eAAO,MAAM,sCAAsC,QAAO,MAClB,CAAC;AAEzC;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB,GAAI,OAAO,OAAO,KAAG,OAGG,CAAC;AAE5D,eAAO,MAAM,YAAY,GAAI,OAAO,OAAO,KAAG,MACU,CAAC;AAEzD,eAAO,MAAM,+BAA+B,GAC1C,OAAO,OAAO,EACd,UAAU,MAAM,KACf,OASF,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,wBAAwB,GACnC,OAAO,OAAO,EACd,UAAU,MAAM,KACf,OAiBF,CAAC"}
@@ -1,3 +1,5 @@
1
+ import { VERCEL_403_ERROR_MESSAGE } from '@workflow/errors';
2
+ import { logger } from '../config/log.js';
1
3
  const OBSERVABILITY_UPGRADE_REQUIRED_CODE = 'observability-upgrade-required';
2
4
  const OBSERVABILITY_UPGRADE_REQUIRED_MESSAGE = 'This workflow observability data is outside your current plan window. Upgrade Observability Plus to view up to 30 days of workflow data.';
3
5
  const extractErrorCode = (err) => {
@@ -24,4 +26,60 @@ export const isObservabilityUpgradeRequiredError = (error) => {
24
26
  extractErrorCode(err) === OBSERVABILITY_UPGRADE_REQUIRED_CODE);
25
27
  };
26
28
  export const getObservabilityUpgradeRequiredMessage = () => OBSERVABILITY_UPGRADE_REQUIRED_MESSAGE;
27
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9pbnNwZWN0L2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLG1DQUFtQyxHQUFHLGdDQUFnQyxDQUFDO0FBQzdFLE1BQU0sc0NBQXNDLEdBQzFDLDBJQUEwSSxDQUFDO0FBRTdJLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxHQUE0QixFQUFzQixFQUFFO0lBQzVFLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxPQUFPLEdBQUcsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDN0MsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksT0FBTyxHQUFHLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzdDLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUErQixDQUFDO1FBQ2pELElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDL0MsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ25CLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2pELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNwQixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG1DQUFtQyxHQUFHLENBQ2pELEtBQWMsRUFDTCxFQUFFO0lBQ1gsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUN4QyxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxNQUFNLEdBQUcsR0FBRyxLQUFnQyxDQUFDO0lBQzdDLE9BQU8sQ0FDTCxHQUFHLENBQUMsTUFBTSxLQUFLLEdBQUc7UUFDbEIsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEtBQUssbUNBQW1DLENBQzlELENBQUM7QUFDSixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxzQ0FBc0MsR0FBRyxHQUFXLEVBQUUsQ0FDakUsc0NBQXNDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBPQlNFUlZBQklMSVRZX1VQR1JBREVfUkVRVUlSRURfQ09ERSA9ICdvYnNlcnZhYmlsaXR5LXVwZ3JhZGUtcmVxdWlyZWQnO1xuY29uc3QgT0JTRVJWQUJJTElUWV9VUEdSQURFX1JFUVVJUkVEX01FU1NBR0UgPVxuICAnVGhpcyB3b3JrZmxvdyBvYnNlcnZhYmlsaXR5IGRhdGEgaXMgb3V0c2lkZSB5b3VyIGN1cnJlbnQgcGxhbiB3aW5kb3cuIFVwZ3JhZGUgT2JzZXJ2YWJpbGl0eSBQbHVzIHRvIHZpZXcgdXAgdG8gMzAgZGF5cyBvZiB3b3JrZmxvdyBkYXRhLic7XG5cbmNvbnN0IGV4dHJhY3RFcnJvckNvZGUgPSAoZXJyOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmIChlcnIuY29kZSAmJiB0eXBlb2YgZXJyLmNvZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGVyci5jb2RlO1xuICB9XG5cbiAgaWYgKGVyci5ib2R5ICYmIHR5cGVvZiBlcnIuYm9keSA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBib2R5ID0gZXJyLmJvZHkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgaWYgKGJvZHkuY29kZSAmJiB0eXBlb2YgYm9keS5jb2RlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGJvZHkuY29kZTtcbiAgICB9XG4gICAgaWYgKGJvZHkuZXJyb3IgJiYgdHlwZW9mIGJvZHkuZXJyb3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gYm9keS5lcnJvcjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzT2JzZXJ2YWJpbGl0eVVwZ3JhZGVSZXF1aXJlZEVycm9yID0gKFxuICBlcnJvcjogdW5rbm93blxuKTogYm9vbGVhbiA9PiB7XG4gIGlmICghZXJyb3IgfHwgdHlwZW9mIGVycm9yICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGVyciA9IGVycm9yIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICByZXR1cm4gKFxuICAgIGVyci5zdGF0dXMgPT09IDQwMiAmJlxuICAgIGV4dHJhY3RFcnJvckNvZGUoZXJyKSA9PT0gT0JTRVJWQUJJTElUWV9VUEdSQURFX1JFUVVJUkVEX0NPREVcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRPYnNlcnZhYmlsaXR5VXBncmFkZVJlcXVpcmVkTWVzc2FnZSA9ICgpOiBzdHJpbmcgPT5cbiAgT0JTRVJWQUJJTElUWV9VUEdSQURFX1JFUVVJUkVEX01FU1NBR0U7XG4iXX0=
29
+ /**
30
+ * True for a client-side argument rejection from the World
31
+ * (`code: 'INVALID_ARGUMENT'`).
32
+ *
33
+ * These carry no HTTP status because no request was made, which is exactly
34
+ * why they need naming: status-based branches let them fall through to be
35
+ * rethrown as an unhandled exception, which prints nothing.
36
+ */
37
+ export const isInvalidArgumentError = (error) => typeof error === 'object' &&
38
+ error !== null &&
39
+ error.code === 'INVALID_ARGUMENT';
40
+ export const errorMessage = (error) => error instanceof Error ? error.message : String(error);
41
+ export const checkAndHandleVercelAccessError = (error, backend) => {
42
+ if (backend === 'vercel' && error && typeof error === 'object') {
43
+ const err = error;
44
+ if (err.status === 403) {
45
+ logger.error(VERCEL_403_ERROR_MESSAGE);
46
+ return true;
47
+ }
48
+ }
49
+ return false;
50
+ };
51
+ /**
52
+ * Report the error classes that are actionable whichever read path produced
53
+ * them: a project-access failure, a plan gate, or an argument the World
54
+ * rejected locally. Returns true when one matched and was logged.
55
+ *
56
+ * Three callers need exactly this set, for the same reason in each case —
57
+ * the message names something the caller can fix, so swallowing it or
58
+ * retrying past it replaces an actionable error with a silent one:
59
+ *
60
+ * - `handleApiError` composes it with its HTTP-status arms;
61
+ * - `listSleeps` uses it alone, to decide what it must report rather than
62
+ * degrade to the event log;
63
+ * - `workflow cancel` uses it alone, having no fallback at all.
64
+ *
65
+ * One definition rather than three, so the set cannot drift between them.
66
+ */
67
+ export const reportActionableApiError = (error, backend) => {
68
+ // Called once: it logs as a side effect when it recognises the error.
69
+ if (checkAndHandleVercelAccessError(error, backend)) {
70
+ return true;
71
+ }
72
+ if (isObservabilityUpgradeRequiredError(error)) {
73
+ logger.error(getObservabilityUpgradeRequiredMessage());
74
+ return true;
75
+ }
76
+ // An argument the World rejected before sending anything. Report it as
77
+ // given: the message already names the method, the parameter, and what it
78
+ // received.
79
+ if (isInvalidArgumentError(error)) {
80
+ logger.error(errorMessage(error));
81
+ return true;
82
+ }
83
+ return false;
84
+ };
85
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9pbnNwZWN0L2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFMUMsTUFBTSxtQ0FBbUMsR0FBRyxnQ0FBZ0MsQ0FBQztBQUM3RSxNQUFNLHNDQUFzQyxHQUMxQywwSUFBMEksQ0FBQztBQUU3SSxNQUFNLGdCQUFnQixHQUFHLENBQUMsR0FBNEIsRUFBc0IsRUFBRTtJQUM1RSxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksT0FBTyxHQUFHLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzdDLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQztJQUNsQixDQUFDO0lBRUQsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLE9BQU8sR0FBRyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM3QyxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsSUFBK0IsQ0FBQztRQUNqRCxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQy9DLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztRQUNuQixDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sSUFBSSxDQUFDLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNqRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDcEIsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxtQ0FBbUMsR0FBRyxDQUNqRCxLQUFjLEVBQ0wsRUFBRTtJQUNYLElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDeEMsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsTUFBTSxHQUFHLEdBQUcsS0FBZ0MsQ0FBQztJQUM3QyxPQUFPLENBQ0wsR0FBRyxDQUFDLE1BQU0sS0FBSyxHQUFHO1FBQ2xCLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLG1DQUFtQyxDQUM5RCxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sc0NBQXNDLEdBQUcsR0FBVyxFQUFFLENBQ2pFLHNDQUFzQyxDQUFDO0FBRXpDOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLEtBQWMsRUFBVyxFQUFFLENBQ2hFLE9BQU8sS0FBSyxLQUFLLFFBQVE7SUFDekIsS0FBSyxLQUFLLElBQUk7SUFDYixLQUE0QixDQUFDLElBQUksS0FBSyxrQkFBa0IsQ0FBQztBQUU1RCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxLQUFjLEVBQVUsRUFBRSxDQUNyRCxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7QUFFekQsTUFBTSxDQUFDLE1BQU0sK0JBQStCLEdBQUcsQ0FDN0MsS0FBYyxFQUNkLE9BQWdCLEVBQ1AsRUFBRTtJQUNYLElBQUksT0FBTyxLQUFLLFFBQVEsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDL0QsTUFBTSxHQUFHLEdBQUcsS0FBZ0MsQ0FBQztRQUM3QyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDdkIsTUFBTSxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1lBQ3ZDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLENBQ3RDLEtBQWMsRUFDZCxPQUFnQixFQUNQLEVBQUU7SUFDWCxzRUFBc0U7SUFDdEUsSUFBSSwrQkFBK0IsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNwRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxJQUFJLG1DQUFtQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDL0MsTUFBTSxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsRUFBRSxDQUFDLENBQUM7UUFDdkQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsdUVBQXVFO0lBQ3ZFLDBFQUEwRTtJQUMxRSxZQUFZO0lBQ1osSUFBSSxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDbEMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBWRVJDRUxfNDAzX0VSUk9SX01FU1NBR0UgfSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2NvbmZpZy9sb2cuanMnO1xuXG5jb25zdCBPQlNFUlZBQklMSVRZX1VQR1JBREVfUkVRVUlSRURfQ09ERSA9ICdvYnNlcnZhYmlsaXR5LXVwZ3JhZGUtcmVxdWlyZWQnO1xuY29uc3QgT0JTRVJWQUJJTElUWV9VUEdSQURFX1JFUVVJUkVEX01FU1NBR0UgPVxuICAnVGhpcyB3b3JrZmxvdyBvYnNlcnZhYmlsaXR5IGRhdGEgaXMgb3V0c2lkZSB5b3VyIGN1cnJlbnQgcGxhbiB3aW5kb3cuIFVwZ3JhZGUgT2JzZXJ2YWJpbGl0eSBQbHVzIHRvIHZpZXcgdXAgdG8gMzAgZGF5cyBvZiB3b3JrZmxvdyBkYXRhLic7XG5cbmNvbnN0IGV4dHJhY3RFcnJvckNvZGUgPSAoZXJyOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmIChlcnIuY29kZSAmJiB0eXBlb2YgZXJyLmNvZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGVyci5jb2RlO1xuICB9XG5cbiAgaWYgKGVyci5ib2R5ICYmIHR5cGVvZiBlcnIuYm9keSA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBib2R5ID0gZXJyLmJvZHkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgaWYgKGJvZHkuY29kZSAmJiB0eXBlb2YgYm9keS5jb2RlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGJvZHkuY29kZTtcbiAgICB9XG4gICAgaWYgKGJvZHkuZXJyb3IgJiYgdHlwZW9mIGJvZHkuZXJyb3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gYm9keS5lcnJvcjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzT2JzZXJ2YWJpbGl0eVVwZ3JhZGVSZXF1aXJlZEVycm9yID0gKFxuICBlcnJvcjogdW5rbm93blxuKTogYm9vbGVhbiA9PiB7XG4gIGlmICghZXJyb3IgfHwgdHlwZW9mIGVycm9yICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGVyciA9IGVycm9yIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICByZXR1cm4gKFxuICAgIGVyci5zdGF0dXMgPT09IDQwMiAmJlxuICAgIGV4dHJhY3RFcnJvckNvZGUoZXJyKSA9PT0gT0JTRVJWQUJJTElUWV9VUEdSQURFX1JFUVVJUkVEX0NPREVcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRPYnNlcnZhYmlsaXR5VXBncmFkZVJlcXVpcmVkTWVzc2FnZSA9ICgpOiBzdHJpbmcgPT5cbiAgT0JTRVJWQUJJTElUWV9VUEdSQURFX1JFUVVJUkVEX01FU1NBR0U7XG5cbi8qKlxuICogVHJ1ZSBmb3IgYSBjbGllbnQtc2lkZSBhcmd1bWVudCByZWplY3Rpb24gZnJvbSB0aGUgV29ybGRcbiAqIChgY29kZTogJ0lOVkFMSURfQVJHVU1FTlQnYCkuXG4gKlxuICogVGhlc2UgY2Fycnkgbm8gSFRUUCBzdGF0dXMgYmVjYXVzZSBubyByZXF1ZXN0IHdhcyBtYWRlLCB3aGljaCBpcyBleGFjdGx5XG4gKiB3aHkgdGhleSBuZWVkIG5hbWluZzogc3RhdHVzLWJhc2VkIGJyYW5jaGVzIGxldCB0aGVtIGZhbGwgdGhyb3VnaCB0byBiZVxuICogcmV0aHJvd24gYXMgYW4gdW5oYW5kbGVkIGV4Y2VwdGlvbiwgd2hpY2ggcHJpbnRzIG5vdGhpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBpc0ludmFsaWRBcmd1bWVudEVycm9yID0gKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiA9PlxuICB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmXG4gIGVycm9yICE9PSBudWxsICYmXG4gIChlcnJvciBhcyB7IGNvZGU/OiB1bmtub3duIH0pLmNvZGUgPT09ICdJTlZBTElEX0FSR1VNRU5UJztcblxuZXhwb3J0IGNvbnN0IGVycm9yTWVzc2FnZSA9IChlcnJvcjogdW5rbm93bik6IHN0cmluZyA9PlxuICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG5cbmV4cG9ydCBjb25zdCBjaGVja0FuZEhhbmRsZVZlcmNlbEFjY2Vzc0Vycm9yID0gKFxuICBlcnJvcjogdW5rbm93bixcbiAgYmFja2VuZD86IHN0cmluZ1xuKTogYm9vbGVhbiA9PiB7XG4gIGlmIChiYWNrZW5kID09PSAndmVyY2VsJyAmJiBlcnJvciAmJiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3QgZXJyID0gZXJyb3IgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgaWYgKGVyci5zdGF0dXMgPT09IDQwMykge1xuICAgICAgbG9nZ2VyLmVycm9yKFZFUkNFTF80MDNfRVJST1JfTUVTU0FHRSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBSZXBvcnQgdGhlIGVycm9yIGNsYXNzZXMgdGhhdCBhcmUgYWN0aW9uYWJsZSB3aGljaGV2ZXIgcmVhZCBwYXRoIHByb2R1Y2VkXG4gKiB0aGVtOiBhIHByb2plY3QtYWNjZXNzIGZhaWx1cmUsIGEgcGxhbiBnYXRlLCBvciBhbiBhcmd1bWVudCB0aGUgV29ybGRcbiAqIHJlamVjdGVkIGxvY2FsbHkuIFJldHVybnMgdHJ1ZSB3aGVuIG9uZSBtYXRjaGVkIGFuZCB3YXMgbG9nZ2VkLlxuICpcbiAqIFRocmVlIGNhbGxlcnMgbmVlZCBleGFjdGx5IHRoaXMgc2V0LCBmb3IgdGhlIHNhbWUgcmVhc29uIGluIGVhY2ggY2FzZSDigJRcbiAqIHRoZSBtZXNzYWdlIG5hbWVzIHNvbWV0aGluZyB0aGUgY2FsbGVyIGNhbiBmaXgsIHNvIHN3YWxsb3dpbmcgaXQgb3JcbiAqIHJldHJ5aW5nIHBhc3QgaXQgcmVwbGFjZXMgYW4gYWN0aW9uYWJsZSBlcnJvciB3aXRoIGEgc2lsZW50IG9uZTpcbiAqXG4gKiAgIC0gYGhhbmRsZUFwaUVycm9yYCBjb21wb3NlcyBpdCB3aXRoIGl0cyBIVFRQLXN0YXR1cyBhcm1zO1xuICogICAtIGBsaXN0U2xlZXBzYCB1c2VzIGl0IGFsb25lLCB0byBkZWNpZGUgd2hhdCBpdCBtdXN0IHJlcG9ydCByYXRoZXIgdGhhblxuICogICAgIGRlZ3JhZGUgdG8gdGhlIGV2ZW50IGxvZztcbiAqICAgLSBgd29ya2Zsb3cgY2FuY2VsYCB1c2VzIGl0IGFsb25lLCBoYXZpbmcgbm8gZmFsbGJhY2sgYXQgYWxsLlxuICpcbiAqIE9uZSBkZWZpbml0aW9uIHJhdGhlciB0aGFuIHRocmVlLCBzbyB0aGUgc2V0IGNhbm5vdCBkcmlmdCBiZXR3ZWVuIHRoZW0uXG4gKi9cbmV4cG9ydCBjb25zdCByZXBvcnRBY3Rpb25hYmxlQXBpRXJyb3IgPSAoXG4gIGVycm9yOiB1bmtub3duLFxuICBiYWNrZW5kPzogc3RyaW5nXG4pOiBib29sZWFuID0+IHtcbiAgLy8gQ2FsbGVkIG9uY2U6IGl0IGxvZ3MgYXMgYSBzaWRlIGVmZmVjdCB3aGVuIGl0IHJlY29nbmlzZXMgdGhlIGVycm9yLlxuICBpZiAoY2hlY2tBbmRIYW5kbGVWZXJjZWxBY2Nlc3NFcnJvcihlcnJvciwgYmFja2VuZCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoaXNPYnNlcnZhYmlsaXR5VXBncmFkZVJlcXVpcmVkRXJyb3IoZXJyb3IpKSB7XG4gICAgbG9nZ2VyLmVycm9yKGdldE9ic2VydmFiaWxpdHlVcGdyYWRlUmVxdWlyZWRNZXNzYWdlKCkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8vIEFuIGFyZ3VtZW50IHRoZSBXb3JsZCByZWplY3RlZCBiZWZvcmUgc2VuZGluZyBhbnl0aGluZy4gUmVwb3J0IGl0IGFzXG4gIC8vIGdpdmVuOiB0aGUgbWVzc2FnZSBhbHJlYWR5IG5hbWVzIHRoZSBtZXRob2QsIHRoZSBwYXJhbWV0ZXIsIGFuZCB3aGF0IGl0XG4gIC8vIHJlY2VpdmVkLlxuICBpZiAoaXNJbnZhbGlkQXJndW1lbnRFcnJvcihlcnJvcikpIHtcbiAgICBsb2dnZXIuZXJyb3IoZXJyb3JNZXNzYWdlKGVycm9yKSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=errors.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.test.d.ts","sourceRoot":"","sources":["../../../src/lib/inspect/errors.test.ts"],"names":[],"mappings":""}