@workflow/cli 5.0.0-beta.3 → 5.0.0-beta.30

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 (98) hide show
  1. package/dist/base.d.ts.map +1 -1
  2. package/dist/base.js +8 -2
  3. package/dist/commands/build.js +1 -1
  4. package/dist/commands/cancel.d.ts.map +1 -1
  5. package/dist/commands/cancel.js +56 -10
  6. package/dist/commands/dev.js +1 -1
  7. package/dist/commands/health.js +1 -1
  8. package/dist/commands/init.js +1 -1
  9. package/dist/commands/inspect.d.ts +3 -0
  10. package/dist/commands/inspect.d.ts.map +1 -1
  11. package/dist/commands/inspect.js +37 -7
  12. package/dist/commands/start.d.ts.map +1 -1
  13. package/dist/commands/start.js +8 -3
  14. package/dist/commands/transform.js +1 -1
  15. package/dist/commands/validate.js +1 -1
  16. package/dist/commands/web.d.ts +1 -0
  17. package/dist/commands/web.d.ts.map +1 -1
  18. package/dist/commands/web.js +9 -3
  19. package/dist/lib/config/log.js +1 -1
  20. package/dist/lib/config/types.d.ts +6 -1
  21. package/dist/lib/config/types.d.ts.map +1 -1
  22. package/dist/lib/config/types.js +1 -1
  23. package/dist/lib/config/workflow-config.js +1 -1
  24. package/dist/lib/inspect/auth.js +1 -1
  25. package/dist/lib/inspect/env.d.ts +1 -1
  26. package/dist/lib/inspect/env.js +2 -2
  27. package/dist/lib/inspect/errors.d.ts +3 -0
  28. package/dist/lib/inspect/errors.d.ts.map +1 -0
  29. package/dist/lib/inspect/errors.js +27 -0
  30. package/dist/lib/inspect/flags.d.ts +8 -0
  31. package/dist/lib/inspect/flags.d.ts.map +1 -1
  32. package/dist/lib/inspect/flags.js +15 -1
  33. package/dist/lib/inspect/hydration.d.ts +22 -0
  34. package/dist/lib/inspect/hydration.d.ts.map +1 -1
  35. package/dist/lib/inspect/hydration.js +102 -47
  36. package/dist/lib/inspect/hydration.test.d.ts +2 -0
  37. package/dist/lib/inspect/hydration.test.d.ts.map +1 -0
  38. package/dist/lib/inspect/hydration.test.js +23 -0
  39. package/dist/lib/inspect/output.d.ts +2 -2
  40. package/dist/lib/inspect/output.d.ts.map +1 -1
  41. package/dist/lib/inspect/output.js +255 -131
  42. package/dist/lib/inspect/output.test.js +403 -3
  43. package/dist/lib/inspect/pagination.d.ts +10 -1
  44. package/dist/lib/inspect/pagination.d.ts.map +1 -1
  45. package/dist/lib/inspect/pagination.js +20 -4
  46. package/dist/lib/inspect/run.d.ts.map +1 -1
  47. package/dist/lib/inspect/run.js +32 -9
  48. package/dist/lib/inspect/setup.d.ts.map +1 -1
  49. package/dist/lib/inspect/setup.js +42 -6
  50. package/dist/lib/inspect/stream.js +1 -1
  51. package/dist/lib/inspect/terminal-utils.js +1 -1
  52. package/dist/lib/inspect/time-window.d.ts +28 -0
  53. package/dist/lib/inspect/time-window.d.ts.map +1 -0
  54. package/dist/lib/inspect/time-window.js +61 -0
  55. package/dist/lib/inspect/time-window.test.d.ts +2 -0
  56. package/dist/lib/inspect/time-window.test.d.ts.map +1 -0
  57. package/dist/lib/inspect/time-window.test.js +58 -0
  58. package/dist/lib/inspect/vercel-api.d.ts +5 -2
  59. package/dist/lib/inspect/vercel-api.d.ts.map +1 -1
  60. package/dist/lib/inspect/vercel-api.js +12 -37
  61. package/dist/lib/inspect/vercel-api.test.d.ts +2 -0
  62. package/dist/lib/inspect/vercel-api.test.d.ts.map +1 -0
  63. package/dist/lib/inspect/vercel-api.test.js +21 -0
  64. package/dist/lib/inspect/vercel-link.js +1 -1
  65. package/dist/lib/inspect/web.d.ts +24 -0
  66. package/dist/lib/inspect/web.d.ts.map +1 -1
  67. package/dist/lib/inspect/web.js +47 -3
  68. package/dist/lib/update-check.js +1 -1
  69. package/package.json +14 -14
  70. package/dist/base.js.map +0 -1
  71. package/dist/commands/build.js.map +0 -1
  72. package/dist/commands/cancel.js.map +0 -1
  73. package/dist/commands/dev.js.map +0 -1
  74. package/dist/commands/health.js.map +0 -1
  75. package/dist/commands/init.js.map +0 -1
  76. package/dist/commands/inspect.js.map +0 -1
  77. package/dist/commands/start.js.map +0 -1
  78. package/dist/commands/transform.js.map +0 -1
  79. package/dist/commands/validate.js.map +0 -1
  80. package/dist/commands/web.js.map +0 -1
  81. package/dist/lib/config/log.js.map +0 -1
  82. package/dist/lib/config/types.js.map +0 -1
  83. package/dist/lib/config/workflow-config.js.map +0 -1
  84. package/dist/lib/inspect/auth.js.map +0 -1
  85. package/dist/lib/inspect/env.js.map +0 -1
  86. package/dist/lib/inspect/flags.js.map +0 -1
  87. package/dist/lib/inspect/hydration.js.map +0 -1
  88. package/dist/lib/inspect/output.js.map +0 -1
  89. package/dist/lib/inspect/output.test.js.map +0 -1
  90. package/dist/lib/inspect/pagination.js.map +0 -1
  91. package/dist/lib/inspect/run.js.map +0 -1
  92. package/dist/lib/inspect/setup.js.map +0 -1
  93. package/dist/lib/inspect/stream.js.map +0 -1
  94. package/dist/lib/inspect/terminal-utils.js.map +0 -1
  95. package/dist/lib/inspect/vercel-api.js.map +0 -1
  96. package/dist/lib/inspect/vercel-link.js.map +0 -1
  97. package/dist/lib/inspect/web.js.map +0 -1
  98. package/dist/lib/update-check.js.map +0 -1
@@ -1,5 +1,6 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { formatTableValue, hasExpiredData } from './output.js';
1
+ import { afterEach, describe, expect, it, vi } from 'vitest';
2
+ import { getObservabilityUpgradeRequiredMessage, isObservabilityUpgradeRequiredError, } from './errors.js';
3
+ import { formatTableValue, hasExpiredData, listEvents, listRuns, listSleeps, listSteps, } from './output.js';
3
4
  const makeRun = (overrides = {}) => ({
4
5
  runId: 'run-1',
5
6
  status: 'running',
@@ -17,6 +18,9 @@ const makeRun = (overrides = {}) => ({
17
18
  executionContext: {},
18
19
  ...overrides,
19
20
  });
21
+ afterEach(() => {
22
+ vi.restoreAllMocks();
23
+ });
20
24
  describe('hasExpiredData', () => {
21
25
  it('returns false when expiredAt is undefined', () => {
22
26
  expect(hasExpiredData(makeRun({ expiredAt: undefined }))).toBe(false);
@@ -49,4 +53,400 @@ describe('formatTableValue expired data handling', () => {
49
53
  expect(String(result)).not.toContain('expired');
50
54
  });
51
55
  });
52
- //# sourceMappingURL=output.test.js.map
56
+ describe('isObservabilityUpgradeRequiredError', () => {
57
+ it('detects workflow analytics 402 errors by top-level code', () => {
58
+ expect(isObservabilityUpgradeRequiredError({
59
+ status: 402,
60
+ code: 'observability-upgrade-required',
61
+ })).toBe(true);
62
+ });
63
+ it('detects workflow analytics 402 errors by response body error', () => {
64
+ expect(isObservabilityUpgradeRequiredError({
65
+ status: 402,
66
+ body: { error: 'observability-upgrade-required' },
67
+ })).toBe(true);
68
+ });
69
+ it('does not treat 404s as upgrade prompts', () => {
70
+ expect(isObservabilityUpgradeRequiredError({
71
+ status: 404,
72
+ code: 'observability-upgrade-required',
73
+ })).toBe(false);
74
+ });
75
+ it('uses an upgrade prompt message', () => {
76
+ expect(getObservabilityUpgradeRequiredMessage()).toContain('Upgrade Observability Plus');
77
+ });
78
+ });
79
+ describe('listRuns', () => {
80
+ it('preserves analytics page metadata in JSON output', async () => {
81
+ const run = {
82
+ runId: 'run-1',
83
+ status: 'running',
84
+ deploymentId: 'dep-1',
85
+ workflowName: 'workflow//./src/workflows/test//myWorkflow',
86
+ specVersion: 2,
87
+ attributes: {},
88
+ createdAt: new Date('2026-06-30T00:00:00.000Z'),
89
+ updatedAt: new Date('2026-06-30T00:00:00.000Z'),
90
+ startedAt: new Date('2026-06-30T00:00:01.000Z'),
91
+ completedAt: null,
92
+ errorCode: null,
93
+ workflowCoreVersion: null,
94
+ workflowEncryptionEnabled: false,
95
+ };
96
+ const pageInfo = {
97
+ currentLookbackDays: 2,
98
+ maxLookbackDays: 30,
99
+ currentWindowStart: new Date('2026-06-28T00:00:00.000Z'),
100
+ maxWindowStart: new Date('2026-06-01T00:00:00.000Z'),
101
+ upgradeAvailable: true,
102
+ };
103
+ const world = {
104
+ analytics: {
105
+ runs: {
106
+ list: vi.fn().mockResolvedValue({
107
+ data: [run],
108
+ cursor: null,
109
+ hasMore: false,
110
+ pageInfo,
111
+ }),
112
+ },
113
+ },
114
+ };
115
+ const write = vi
116
+ .spyOn(process.stdout, 'write')
117
+ .mockImplementation(() => true);
118
+ await listRuns(world, { json: true });
119
+ expect(world.analytics?.runs.list).toHaveBeenCalledWith({
120
+ workflowName: undefined,
121
+ status: undefined,
122
+ pagination: {
123
+ sortOrder: 'desc',
124
+ cursor: undefined,
125
+ limit: 20,
126
+ },
127
+ });
128
+ expect(write).toHaveBeenCalledTimes(1);
129
+ expect(JSON.parse(String(write.mock.calls[0][0]))).toEqual({
130
+ data: [
131
+ {
132
+ ...run,
133
+ createdAt: '2026-06-30T00:00:00.000Z',
134
+ updatedAt: '2026-06-30T00:00:00.000Z',
135
+ startedAt: '2026-06-30T00:00:01.000Z',
136
+ },
137
+ ],
138
+ cursor: null,
139
+ hasMore: false,
140
+ pageInfo: {
141
+ currentLookbackDays: 2,
142
+ maxLookbackDays: 30,
143
+ currentWindowStart: '2026-06-28T00:00:00.000Z',
144
+ maxWindowStart: '2026-06-01T00:00:00.000Z',
145
+ upgradeAvailable: true,
146
+ },
147
+ });
148
+ });
149
+ });
150
+ describe('listSteps', () => {
151
+ it('passes cursors and preserves the JSON array output', async () => {
152
+ const step = {
153
+ runId: 'run-1',
154
+ stepId: 'step-1',
155
+ stepName: 'doWork',
156
+ status: 'completed',
157
+ attempt: 1,
158
+ createdAt: new Date('2026-06-30T00:00:00.000Z'),
159
+ updatedAt: new Date('2026-06-30T00:00:02.000Z'),
160
+ startedAt: new Date('2026-06-30T00:00:01.000Z'),
161
+ completedAt: new Date('2026-06-30T00:00:02.000Z'),
162
+ retryAfter: null,
163
+ errorCode: null,
164
+ workflowCoreVersion: null,
165
+ workflowEncryptionEnabled: false,
166
+ };
167
+ const world = {
168
+ analytics: {
169
+ steps: {
170
+ list: vi.fn().mockResolvedValue({
171
+ data: [step],
172
+ cursor: 'next-step-cursor',
173
+ hasMore: true,
174
+ }),
175
+ },
176
+ },
177
+ };
178
+ const write = vi
179
+ .spyOn(process.stdout, 'write')
180
+ .mockImplementation(() => true);
181
+ await listSteps(world, {
182
+ json: true,
183
+ runId: 'run-1',
184
+ cursor: 'step-cursor',
185
+ limit: 1,
186
+ });
187
+ expect(world.analytics?.steps.list).toHaveBeenCalledWith({
188
+ runId: 'run-1',
189
+ pagination: {
190
+ sortOrder: 'desc',
191
+ cursor: 'step-cursor',
192
+ limit: 1,
193
+ },
194
+ });
195
+ expect(JSON.parse(String(write.mock.calls[0][0]))).toEqual([
196
+ {
197
+ ...step,
198
+ createdAt: '2026-06-30T00:00:00.000Z',
199
+ updatedAt: '2026-06-30T00:00:02.000Z',
200
+ startedAt: '2026-06-30T00:00:01.000Z',
201
+ completedAt: '2026-06-30T00:00:02.000Z',
202
+ },
203
+ ]);
204
+ });
205
+ it('falls back to storage when the first analytics page is empty', async () => {
206
+ const step = {
207
+ runId: 'run-1',
208
+ stepId: 'step-1',
209
+ stepName: 'step//./src/workflows/test//doWork',
210
+ status: 'completed',
211
+ attempt: 1,
212
+ input: undefined,
213
+ output: undefined,
214
+ createdAt: new Date('2026-06-30T00:00:00.000Z'),
215
+ updatedAt: new Date('2026-06-30T00:00:02.000Z'),
216
+ startedAt: new Date('2026-06-30T00:00:01.000Z'),
217
+ completedAt: new Date('2026-06-30T00:00:02.000Z'),
218
+ };
219
+ const world = {
220
+ analytics: {
221
+ steps: {
222
+ list: vi.fn().mockResolvedValue({
223
+ data: [],
224
+ cursor: null,
225
+ hasMore: false,
226
+ }),
227
+ },
228
+ },
229
+ steps: {
230
+ list: vi.fn().mockResolvedValue({
231
+ data: [step],
232
+ cursor: null,
233
+ hasMore: false,
234
+ }),
235
+ },
236
+ };
237
+ const write = vi
238
+ .spyOn(process.stdout, 'write')
239
+ .mockImplementation(() => true);
240
+ await listSteps(world, { json: true, runId: 'run-1' });
241
+ expect(world.analytics?.steps.list).toHaveBeenCalled();
242
+ expect(world.steps.list).toHaveBeenCalledWith({
243
+ runId: 'run-1',
244
+ pagination: {
245
+ sortOrder: 'desc',
246
+ cursor: undefined,
247
+ limit: 20,
248
+ },
249
+ resolveData: 'none',
250
+ });
251
+ expect(JSON.parse(String(write.mock.calls[0][0]))).toEqual([
252
+ {
253
+ ...step,
254
+ createdAt: '2026-06-30T00:00:00.000Z',
255
+ updatedAt: '2026-06-30T00:00:02.000Z',
256
+ startedAt: '2026-06-30T00:00:01.000Z',
257
+ completedAt: '2026-06-30T00:00:02.000Z',
258
+ },
259
+ ]);
260
+ });
261
+ });
262
+ describe('listEvents', () => {
263
+ it('passes cursors and preserves the JSON array output', async () => {
264
+ const event = {
265
+ runId: 'run-1',
266
+ eventId: 'event-1',
267
+ eventType: 'step_completed',
268
+ correlationId: 'step-1',
269
+ entityId: 'step-1',
270
+ stepName: 'doWork',
271
+ workflowName: 'workflow//./src/workflows/test//myWorkflow',
272
+ deploymentId: 'dep-1',
273
+ specVersion: 2,
274
+ runCreatedAt: new Date('2026-06-30T00:00:00.000Z'),
275
+ createdAt: new Date('2026-06-30T00:00:02.000Z'),
276
+ region: null,
277
+ vercelId: null,
278
+ requestId: null,
279
+ resumeAt: null,
280
+ retryAfter: null,
281
+ errorCode: null,
282
+ workflowCoreVersion: null,
283
+ isWebhook: false,
284
+ isSystem: false,
285
+ workflowEncryptionEnabled: false,
286
+ };
287
+ const world = {
288
+ analytics: {
289
+ events: {
290
+ list: vi.fn().mockResolvedValue({
291
+ data: [event],
292
+ cursor: 'next-event-cursor',
293
+ hasMore: true,
294
+ }),
295
+ },
296
+ },
297
+ };
298
+ const write = vi
299
+ .spyOn(process.stdout, 'write')
300
+ .mockImplementation(() => true);
301
+ await listEvents(world, {
302
+ json: true,
303
+ runId: 'run-1',
304
+ cursor: 'event-cursor',
305
+ limit: 1,
306
+ });
307
+ expect(world.analytics?.events.list).toHaveBeenCalledWith({
308
+ runId: 'run-1',
309
+ correlationId: undefined,
310
+ pagination: {
311
+ sortOrder: 'desc',
312
+ cursor: 'event-cursor',
313
+ limit: 1,
314
+ },
315
+ });
316
+ expect(JSON.parse(String(write.mock.calls[0][0]))).toEqual([
317
+ {
318
+ ...event,
319
+ runCreatedAt: '2026-06-30T00:00:00.000Z',
320
+ createdAt: '2026-06-30T00:00:02.000Z',
321
+ },
322
+ ]);
323
+ });
324
+ it('falls back to storage when the first analytics page is empty', async () => {
325
+ const event = {
326
+ runId: 'run-1',
327
+ eventId: 'event-1',
328
+ eventType: 'step_completed',
329
+ correlationId: 'step-1',
330
+ eventData: {
331
+ stepName: 'doWork',
332
+ result: undefined,
333
+ },
334
+ createdAt: new Date('2026-06-30T00:00:02.000Z'),
335
+ };
336
+ const world = {
337
+ analytics: {
338
+ events: {
339
+ list: vi.fn().mockResolvedValue({
340
+ data: [],
341
+ cursor: null,
342
+ hasMore: false,
343
+ }),
344
+ },
345
+ },
346
+ events: {
347
+ list: vi.fn().mockResolvedValue({
348
+ data: [event],
349
+ cursor: null,
350
+ hasMore: false,
351
+ }),
352
+ },
353
+ };
354
+ const write = vi
355
+ .spyOn(process.stdout, 'write')
356
+ .mockImplementation(() => true);
357
+ await listEvents(world, { json: true, runId: 'run-1' });
358
+ expect(world.analytics?.events.list).toHaveBeenCalled();
359
+ expect(world.events.list).toHaveBeenCalledWith({
360
+ runId: 'run-1',
361
+ pagination: {
362
+ sortOrder: 'desc',
363
+ cursor: undefined,
364
+ limit: 20,
365
+ },
366
+ resolveData: 'none',
367
+ });
368
+ expect(JSON.parse(String(write.mock.calls[0][0]))).toEqual([
369
+ {
370
+ ...event,
371
+ createdAt: '2026-06-30T00:00:02.000Z',
372
+ },
373
+ ]);
374
+ });
375
+ });
376
+ describe('listSleeps', () => {
377
+ const wait = {
378
+ runId: 'run-1',
379
+ waitId: 'wait-1',
380
+ status: 'waiting',
381
+ resumeAt: new Date('2026-06-30T00:01:00.000Z'),
382
+ createdAt: new Date('2026-06-30T00:00:00.000Z'),
383
+ updatedAt: new Date('2026-06-30T00:00:00.000Z'),
384
+ completedAt: null,
385
+ workflowCoreVersion: null,
386
+ workflowEncryptionEnabled: false,
387
+ };
388
+ const pageInfo = {
389
+ currentLookbackDays: 2,
390
+ maxLookbackDays: 30,
391
+ currentWindowStart: new Date('2026-06-28T00:00:00.000Z'),
392
+ maxWindowStart: new Date('2026-06-01T00:00:00.000Z'),
393
+ upgradeAvailable: true,
394
+ };
395
+ it('passes cursors and preserves the JSON array output through analytics', async () => {
396
+ const world = {
397
+ analytics: {
398
+ waits: {
399
+ list: vi.fn().mockResolvedValue({
400
+ data: [wait],
401
+ cursor: 'next-wait-cursor',
402
+ hasMore: true,
403
+ pageInfo,
404
+ }),
405
+ },
406
+ },
407
+ };
408
+ const write = vi
409
+ .spyOn(process.stdout, 'write')
410
+ .mockImplementation(() => true);
411
+ await listSleeps(world, {
412
+ json: true,
413
+ runId: 'run-1',
414
+ cursor: 'wait-cursor',
415
+ limit: 1,
416
+ });
417
+ expect(world.analytics?.waits.list).toHaveBeenCalledWith({
418
+ runId: 'run-1',
419
+ pagination: {
420
+ sortOrder: 'desc',
421
+ cursor: 'wait-cursor',
422
+ limit: 1,
423
+ },
424
+ });
425
+ expect(JSON.parse(String(write.mock.calls[0][0]))).toEqual([
426
+ {
427
+ ...wait,
428
+ resumeAt: '2026-06-30T00:01:00.000Z',
429
+ createdAt: '2026-06-30T00:00:00.000Z',
430
+ updatedAt: '2026-06-30T00:00:00.000Z',
431
+ },
432
+ ]);
433
+ });
434
+ it('surfaces the observability upgrade hint in table mode', async () => {
435
+ const world = {
436
+ analytics: {
437
+ waits: {
438
+ list: vi.fn().mockResolvedValue({
439
+ data: [wait],
440
+ cursor: null,
441
+ hasMore: false,
442
+ pageInfo,
443
+ }),
444
+ },
445
+ },
446
+ };
447
+ const log = vi.spyOn(console, 'log').mockImplementation(() => undefined);
448
+ await listSleeps(world, { runId: 'run-1' });
449
+ expect(log.mock.calls.flat().join('\n')).toContain('Upgrade Observability Plus');
450
+ });
451
+ });
452
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0cHV0LnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2luc3BlY3Qvb3V0cHV0LnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBVUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDN0QsT0FBTyxFQUNMLHNDQUFzQyxFQUN0QyxtQ0FBbUMsR0FDcEMsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixjQUFjLEVBQ2QsVUFBVSxFQUNWLFFBQVEsRUFDUixVQUFVLEVBQ1YsU0FBUyxHQUNWLE1BQU0sYUFBYSxDQUFDO0FBRXJCLE1BQU0sT0FBTyxHQUFHLENBQUMsWUFBa0MsRUFBRSxFQUFlLEVBQUUsQ0FDcEUsQ0FBQztJQUNDLEtBQUssRUFBRSxPQUFPO0lBQ2QsTUFBTSxFQUFFLFNBQVM7SUFDakIsWUFBWSxFQUFFLE9BQU87SUFDckIsWUFBWSxFQUFFLDRDQUE0QztJQUMxRCxLQUFLLEVBQUUsU0FBUztJQUNoQixNQUFNLEVBQUUsU0FBUztJQUNqQixLQUFLLEVBQUUsU0FBUztJQUNoQixTQUFTLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQ2pDLFNBQVMsRUFBRSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDakMsV0FBVyxFQUFFLFNBQVM7SUFDdEIsU0FBUyxFQUFFLFNBQVM7SUFDcEIsU0FBUyxFQUFFLFNBQVM7SUFDcEIsV0FBVyxFQUFFLENBQUM7SUFDZCxnQkFBZ0IsRUFBRSxFQUFFO0lBQ3BCLEdBQUcsU0FBUztDQUNiLENBQTJCLENBQUM7QUFFL0IsU0FBUyxDQUFDLEdBQUcsRUFBRTtJQUNiLEVBQUUsQ0FBQyxlQUFlLEVBQUUsQ0FBQztBQUN2QixDQUFDLENBQUMsQ0FBQztBQUVILFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLEVBQUU7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O0lBRUgsRUFBRSxDQUFDLHVEQUF1RCxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3JFLE1BQU0sS0FBSyxHQUFHO1lBQ1osU0FBUyxFQUFFO2dCQUNULEtBQUssRUFBRTtvQkFDTCxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDO3dCQUM5QixJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUM7d0JBQ1osTUFBTSxFQUFFLElBQUk7d0JBQ1osT0FBTyxFQUFFLEtBQUs7d0JBQ2QsUUFBUTtxQkFDVCxDQUFDO2lCQUNIO2FBQ0Y7U0FDa0IsQ0FBQztRQUN0QixNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV6RSxNQUFNLFVBQVUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUU1QyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUNoRCw0QkFBNEIsQ0FDN0IsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7XG4gIEFuYWx5dGljc0V2ZW50LFxuICBBbmFseXRpY3NSdW4sXG4gIEFuYWx5dGljc1N0ZXAsXG4gIEFuYWx5dGljc1dhaXQsXG4gIEV2ZW50LFxuICBTdGVwLFxuICBXb3JrZmxvd1J1bixcbiAgV29ybGQsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBhZnRlckVhY2gsIGRlc2NyaWJlLCBleHBlY3QsIGl0LCB2aSB9IGZyb20gJ3ZpdGVzdCc7XG5pbXBvcnQge1xuICBnZXRPYnNlcnZhYmlsaXR5VXBncmFkZVJlcXVpcmVkTWVzc2FnZSxcbiAgaXNPYnNlcnZhYmlsaXR5VXBncmFkZVJlcXVpcmVkRXJyb3IsXG59IGZyb20gJy4vZXJyb3JzLmpzJztcbmltcG9ydCB7XG4gIGZvcm1hdFRhYmxlVmFsdWUsXG4gIGhhc0V4cGlyZWREYXRhLFxuICBsaXN0RXZlbnRzLFxuICBsaXN0UnVucyxcbiAgbGlzdFNsZWVwcyxcbiAgbGlzdFN0ZXBzLFxufSBmcm9tICcuL291dHB1dC5qcyc7XG5cbmNvbnN0IG1ha2VSdW4gPSAob3ZlcnJpZGVzOiBQYXJ0aWFsPFdvcmtmbG93UnVuPiA9IHt9KTogV29ya2Zsb3dSdW4gPT5cbiAgKHtcbiAgICBydW5JZDogJ3J1bi0xJyxcbiAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICBkZXBsb3ltZW50SWQ6ICdkZXAtMScsXG4gICAgd29ya2Zsb3dOYW1lOiAnd29ya2Zsb3cvLy4vc3JjL3dvcmtmbG93cy90ZXN0Ly9teVdvcmtmbG93JyxcbiAgICBpbnB1dDogdW5kZWZpbmVkLFxuICAgIG91dHB1dDogdW5kZWZpbmVkLFxuICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgnMjAyNS0wMS0wMScpLFxuICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoJzIwMjUtMDEtMDEnKSxcbiAgICBjb21wbGV0ZWRBdDogdW5kZWZpbmVkLFxuICAgIHN0YXJ0ZWRBdDogdW5kZWZpbmVkLFxuICAgIGV4cGlyZWRBdDogdW5kZWZpbmVkLFxuICAgIHNwZWNWZXJzaW9uOiAyLFxuICAgIGV4ZWN1dGlvbkNvbnRleHQ6IHt9LFxuICAgIC4uLm92ZXJyaWRlcyxcbiAgfSkgYXMgdW5rbm93biBhcyBXb3JrZmxvd1J1bjtcblxuYWZ0ZXJFYWNoKCgpID0+IHtcbiAgdmkucmVzdG9yZUFsbE1vY2tzKCk7XG59KTtcblxuZGVzY3JpYmUoJ2hhc0V4cGlyZWREYXRhJywgKCkgPT4ge1xuICBpdCgncmV0dXJucyBmYWxzZSB3aGVuIGV4cGlyZWRBdCBpcyB1bmRlZmluZWQnLCAoKSA9PiB7XG4gICAgZXhwZWN0KGhhc0V4cGlyZWREYXRhKG1ha2VSdW4oeyBleHBpcmVkQXQ6IHVuZGVmaW5lZCB9KSkpLnRvQmUoZmFsc2UpO1xuICB9KTtcblxuICBpdCgncmV0dXJucyBmYWxzZSB3aGVuIGV4cGlyZWRBdCBpcyBpbiB0aGUgZnV0dXJlJywgKCkgPT4ge1xuICAgIGNvbnN0IGZ1dHVyZSA9IG5ldyBEYXRlKERhdGUubm93KCkgKyAyNCAqIDYwICogNjAgKiAxMDAwKTtcbiAgICBleHBlY3QoaGFzRXhwaXJlZERhdGEobWFrZVJ1bih7IGV4cGlyZWRBdDogZnV0dXJlIH0pKSkudG9CZShmYWxzZSk7XG4gIH0pO1xuXG4gIGl0KCdyZXR1cm5zIHRydWUgd2hlbiBleHBpcmVkQXQgaXMgaW4gdGhlIHBhc3QnLCAoKSA9PiB7XG4gICAgY29uc3QgcGFzdCA9IG5ldyBEYXRlKERhdGUubm93KCkgLSAyNCAqIDYwICogNjAgKiAxMDAwKTtcbiAgICBleHBlY3QoaGFzRXhwaXJlZERhdGEobWFrZVJ1bih7IGV4cGlyZWRBdDogcGFzdCB9KSkpLnRvQmUodHJ1ZSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdmb3JtYXRUYWJsZVZhbHVlIGV4cGlyZWQgZGF0YSBoYW5kbGluZycsICgpID0+IHtcbiAgaXQoJ3JldHVybnMgaW5wdXQgdmFsdWUgd2hlbiBleHBpcmVkQXQgaXMgaW4gdGhlIGZ1dHVyZScsICgpID0+IHtcbiAgICBjb25zdCBmdXR1cmUgPSBuZXcgRGF0ZShEYXRlLm5vdygpICsgMjQgKiA2MCAqIDYwICogMTAwMCk7XG4gICAgY29uc3QgaXRlbSA9IHsgZXhwaXJlZEF0OiBmdXR1cmUudG9JU09TdHJpbmcoKSwgaW5wdXQ6ICdoZWxsbycgfTtcbiAgICBjb25zdCByZXN1bHQgPSBmb3JtYXRUYWJsZVZhbHVlKCdpbnB1dCcsICdoZWxsbycsIHt9LCB1bmRlZmluZWQsIGl0ZW0pO1xuICAgIGV4cGVjdChyZXN1bHQpLm5vdC50b0NvbnRhaW4oJ2V4cGlyZWQnKTtcbiAgfSk7XG5cbiAgaXQoJ3JldHVybnMgZXhwaXJlZCBtZXNzYWdlIHdoZW4gZXhwaXJlZEF0IGlzIGluIHRoZSBwYXN0JywgKCkgPT4ge1xuICAgIGNvbnN0IHBhc3QgPSBuZXcgRGF0ZShEYXRlLm5vdygpIC0gMjQgKiA2MCAqIDYwICogMTAwMCk7XG4gICAgY29uc3QgaXRlbSA9IHsgZXhwaXJlZEF0OiBwYXN0LnRvSVNPU3RyaW5nKCksIG91dHB1dDogJ2hlbGxvJyB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGZvcm1hdFRhYmxlVmFsdWUoJ291dHB1dCcsICdoZWxsbycsIHt9LCB1bmRlZmluZWQsIGl0ZW0pO1xuICAgIGV4cGVjdChTdHJpbmcocmVzdWx0KSkudG9Db250YWluKCdkYXRhIGV4cGlyZWQnKTtcbiAgfSk7XG5cbiAgaXQoJ3JldHVybnMgaW5wdXQgdmFsdWUgd2hlbiBleHBpcmVkQXQgaXMgbm90IHByZXNlbnQnLCAoKSA9PiB7XG4gICAgY29uc3QgaXRlbSA9IHsgaW5wdXQ6ICdoZWxsbycgfTtcbiAgICBjb25zdCByZXN1bHQgPSBmb3JtYXRUYWJsZVZhbHVlKCdpbnB1dCcsICdoZWxsbycsIHt9LCB1bmRlZmluZWQsIGl0ZW0pO1xuICAgIGV4cGVjdChTdHJpbmcocmVzdWx0KSkubm90LnRvQ29udGFpbignZXhwaXJlZCcpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnaXNPYnNlcnZhYmlsaXR5VXBncmFkZVJlcXVpcmVkRXJyb3InLCAoKSA9PiB7XG4gIGl0KCdkZXRlY3RzIHdvcmtmbG93IGFuYWx5dGljcyA0MDIgZXJyb3JzIGJ5IHRvcC1sZXZlbCBjb2RlJywgKCkgPT4ge1xuICAgIGV4cGVjdChcbiAgICAgIGlzT2JzZXJ2YWJpbGl0eVVwZ3JhZGVSZXF1aXJlZEVycm9yKHtcbiAgICAgICAgc3RhdHVzOiA0MDIsXG4gICAgICAgIGNvZGU6ICdvYnNlcnZhYmlsaXR5LXVwZ3JhZGUtcmVxdWlyZWQnLFxuICAgICAgfSlcbiAgICApLnRvQmUodHJ1ZSk7XG4gIH0pO1xuXG4gIGl0KCdkZXRlY3RzIHdvcmtmbG93IGFuYWx5dGljcyA0MDIgZXJyb3JzIGJ5IHJlc3BvbnNlIGJvZHkgZXJyb3InLCAoKSA9PiB7XG4gICAgZXhwZWN0KFxuICAgICAgaXNPYnNlcnZhYmlsaXR5VXBncmFkZVJlcXVpcmVkRXJyb3Ioe1xuICAgICAgICBzdGF0dXM6IDQwMixcbiAgICAgICAgYm9keTogeyBlcnJvcjogJ29ic2VydmFiaWxpdHktdXBncmFkZS1yZXF1aXJlZCcgfSxcbiAgICAgIH0pXG4gICAgKS50b0JlKHRydWUpO1xuICB9KTtcblxuICBpdCgnZG9lcyBub3QgdHJlYXQgNDA0cyBhcyB1cGdyYWRlIHByb21wdHMnLCAoKSA9PiB7XG4gICAgZXhwZWN0KFxuICAgICAgaXNPYnNlcnZhYmlsaXR5VXBncmFkZVJlcXVpcmVkRXJyb3Ioe1xuICAgICAgICBzdGF0dXM6IDQwNCxcbiAgICAgICAgY29kZTogJ29ic2VydmFiaWxpdHktdXBncmFkZS1yZXF1aXJlZCcsXG4gICAgICB9KVxuICAgICkudG9CZShmYWxzZSk7XG4gIH0pO1xuXG4gIGl0KCd1c2VzIGFuIHVwZ3JhZGUgcHJvbXB0IG1lc3NhZ2UnLCAoKSA9PiB7XG4gICAgZXhwZWN0KGdldE9ic2VydmFiaWxpdHlVcGdyYWRlUmVxdWlyZWRNZXNzYWdlKCkpLnRvQ29udGFpbihcbiAgICAgICdVcGdyYWRlIE9ic2VydmFiaWxpdHkgUGx1cydcbiAgICApO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnbGlzdFJ1bnMnLCAoKSA9PiB7XG4gIGl0KCdwcmVzZXJ2ZXMgYW5hbHl0aWNzIHBhZ2UgbWV0YWRhdGEgaW4gSlNPTiBvdXRwdXQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcnVuID0ge1xuICAgICAgcnVuSWQ6ICdydW4tMScsXG4gICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgIGRlcGxveW1lbnRJZDogJ2RlcC0xJyxcbiAgICAgIHdvcmtmbG93TmFtZTogJ3dvcmtmbG93Ly8uL3NyYy93b3JrZmxvd3MvdGVzdC8vbXlXb3JrZmxvdycsXG4gICAgICBzcGVjVmVyc2lvbjogMixcbiAgICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgnMjAyNi0wNi0zMFQwMDowMDowMC4wMDBaJyksXG4gICAgICB1cGRhdGVkQXQ6IG5ldyBEYXRlKCcyMDI2LTA2LTMwVDAwOjAwOjAwLjAwMFonKSxcbiAgICAgIHN0YXJ0ZWRBdDogbmV3IERhdGUoJzIwMjYtMDYtMzBUMDA6MDA6MDEuMDAwWicpLFxuICAgICAgY29tcGxldGVkQXQ6IG51bGwsXG4gICAgICBlcnJvckNvZGU6IG51bGwsXG4gICAgICB3b3JrZmxvd0NvcmVWZXJzaW9uOiBudWxsLFxuICAgICAgd29ya2Zsb3dFbmNyeXB0aW9uRW5hYmxlZDogZmFsc2UsXG4gICAgfSBzYXRpc2ZpZXMgQW5hbHl0aWNzUnVuO1xuICAgIGNvbnN0IHBhZ2VJbmZvID0ge1xuICAgICAgY3VycmVudExvb2tiYWNrRGF5czogMixcbiAgICAgIG1heExvb2tiYWNrRGF5czogMzAsXG4gICAgICBjdXJyZW50V2luZG93U3RhcnQ6IG5ldyBEYXRlKCcyMDI2LTA2LTI4VDAwOjAwOjAwLjAwMFonKSxcbiAgICAgIG1heFdpbmRvd1N0YXJ0OiBuZXcgRGF0ZSgnMjAyNi0wNi0wMVQwMDowMDowMC4wMDBaJyksXG4gICAgICB1cGdyYWRlQXZhaWxhYmxlOiB0cnVlLFxuICAgIH07XG4gICAgY29uc3Qgd29ybGQgPSB7XG4gICAgICBhbmFseXRpY3M6IHtcbiAgICAgICAgcnVuczoge1xuICAgICAgICAgIGxpc3Q6IHZpLmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoe1xuICAgICAgICAgICAgZGF0YTogW3J1bl0sXG4gICAgICAgICAgICBjdXJzb3I6IG51bGwsXG4gICAgICAgICAgICBoYXNNb3JlOiBmYWxzZSxcbiAgICAgICAgICAgIHBhZ2VJbmZvLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9IGFzIHVua25vd24gYXMgV29ybGQ7XG4gICAgY29uc3Qgd3JpdGUgPSB2aVxuICAgICAgLnNweU9uKHByb2Nlc3Muc3Rkb3V0LCAnd3JpdGUnKVxuICAgICAgLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB0cnVlKTtcblxuICAgIGF3YWl0IGxpc3RSdW5zKHdvcmxkLCB7IGpzb246IHRydWUgfSk7XG5cbiAgICBleHBlY3Qod29ybGQuYW5hbHl0aWNzPy5ydW5zLmxpc3QpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHtcbiAgICAgIHdvcmtmbG93TmFtZTogdW5kZWZpbmVkLFxuICAgICAgc3RhdHVzOiB1bmRlZmluZWQsXG4gICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgIHNvcnRPcmRlcjogJ2Rlc2MnLFxuICAgICAgICBjdXJzb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgbGltaXQ6IDIwLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBleHBlY3Qod3JpdGUpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICBleHBlY3QoSlNPTi5wYXJzZShTdHJpbmcod3JpdGUubW9jay5jYWxsc1swXVswXSkpKS50b0VxdWFsKHtcbiAgICAgIGRhdGE6IFtcbiAgICAgICAge1xuICAgICAgICAgIC4uLnJ1bixcbiAgICAgICAgICBjcmVhdGVkQXQ6ICcyMDI2LTA2LTMwVDAwOjAwOjAwLjAwMFonLFxuICAgICAgICAgIHVwZGF0ZWRBdDogJzIwMjYtMDYtMzBUMDA6MDA6MDAuMDAwWicsXG4gICAgICAgICAgc3RhcnRlZEF0OiAnMjAyNi0wNi0zMFQwMDowMDowMS4wMDBaJyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBjdXJzb3I6IG51bGwsXG4gICAgICBoYXNNb3JlOiBmYWxzZSxcbiAgICAgIHBhZ2VJbmZvOiB7XG4gICAgICAgIGN1cnJlbnRMb29rYmFja0RheXM6IDIsXG4gICAgICAgIG1heExvb2tiYWNrRGF5czogMzAsXG4gICAgICAgIGN1cnJlbnRXaW5kb3dTdGFydDogJzIwMjYtMDYtMjhUMDA6MDA6MDAuMDAwWicsXG4gICAgICAgIG1heFdpbmRvd1N0YXJ0OiAnMjAyNi0wNi0wMVQwMDowMDowMC4wMDBaJyxcbiAgICAgICAgdXBncmFkZUF2YWlsYWJsZTogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdsaXN0U3RlcHMnLCAoKSA9PiB7XG4gIGl0KCdwYXNzZXMgY3Vyc29ycyBhbmQgcHJlc2VydmVzIHRoZSBKU09OIGFycmF5IG91dHB1dCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzdGVwID0ge1xuICAgICAgcnVuSWQ6ICdydW4tMScsXG4gICAgICBzdGVwSWQ6ICdzdGVwLTEnLFxuICAgICAgc3RlcE5hbWU6ICdkb1dvcmsnLFxuICAgICAgc3RhdHVzOiAnY29tcGxldGVkJyxcbiAgICAgIGF0dGVtcHQ6IDEsXG4gICAgICBjcmVhdGVkQXQ6IG5ldyBEYXRlKCcyMDI2LTA2LTMwVDAwOjAwOjAwLjAwMFonKSxcbiAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoJzIwMjYtMDYtMzBUMDA6MDA6MDIuMDAwWicpLFxuICAgICAgc3RhcnRlZEF0OiBuZXcgRGF0ZSgnMjAyNi0wNi0zMFQwMDowMDowMS4wMDBaJyksXG4gICAgICBjb21wbGV0ZWRBdDogbmV3IERhdGUoJzIwMjYtMDYtMzBUMDA6MDA6MDIuMDAwWicpLFxuICAgICAgcmV0cnlBZnRlcjogbnVsbCxcbiAgICAgIGVycm9yQ29kZTogbnVsbCxcbiAgICAgIHdvcmtmbG93Q29yZVZlcnNpb246IG51bGwsXG4gICAgICB3b3JrZmxvd0VuY3J5cHRpb25FbmFibGVkOiBmYWxzZSxcbiAgICB9IHNhdGlzZmllcyBBbmFseXRpY3NTdGVwO1xuICAgIGNvbnN0IHdvcmxkID0ge1xuICAgICAgYW5hbHl0aWNzOiB7XG4gICAgICAgIHN0ZXBzOiB7XG4gICAgICAgICAgbGlzdDogdmkuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XG4gICAgICAgICAgICBkYXRhOiBbc3RlcF0sXG4gICAgICAgICAgICBjdXJzb3I6ICduZXh0LXN0ZXAtY3Vyc29yJyxcbiAgICAgICAgICAgIGhhc01vcmU6IHRydWUsXG4gICAgICAgICAgfSksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0gYXMgdW5rbm93biBhcyBXb3JsZDtcbiAgICBjb25zdCB3cml0ZSA9IHZpXG4gICAgICAuc3B5T24ocHJvY2Vzcy5zdGRvdXQsICd3cml0ZScpXG4gICAgICAubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHRydWUpO1xuXG4gICAgYXdhaXQgbGlzdFN0ZXBzKHdvcmxkLCB7XG4gICAgICBqc29uOiB0cnVlLFxuICAgICAgcnVuSWQ6ICdydW4tMScsXG4gICAgICBjdXJzb3I6ICdzdGVwLWN1cnNvcicsXG4gICAgICBsaW1pdDogMSxcbiAgICB9KTtcblxuICAgIGV4cGVjdCh3b3JsZC5hbmFseXRpY3M/LnN0ZXBzLmxpc3QpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHtcbiAgICAgIHJ1bklkOiAncnVuLTEnLFxuICAgICAgcGFnaW5hdGlvbjoge1xuICAgICAgICBzb3J0T3JkZXI6ICdkZXNjJyxcbiAgICAgICAgY3Vyc29yOiAnc3RlcC1jdXJzb3InLFxuICAgICAgICBsaW1pdDogMSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgZXhwZWN0KEpTT04ucGFyc2UoU3RyaW5nKHdyaXRlLm1vY2suY2FsbHNbMF1bMF0pKSkudG9FcXVhbChbXG4gICAgICB7XG4gICAgICAgIC4uLnN0ZXAsXG4gICAgICAgIGNyZWF0ZWRBdDogJzIwMjYtMDYtMzBUMDA6MDA6MDAuMDAwWicsXG4gICAgICAgIHVwZGF0ZWRBdDogJzIwMjYtMDYtMzBUMDA6MDA6MDIuMDAwWicsXG4gICAgICAgIHN0YXJ0ZWRBdDogJzIwMjYtMDYtMzBUMDA6MDA6MDEuMDAwWicsXG4gICAgICAgIGNvbXBsZXRlZEF0OiAnMjAyNi0wNi0zMFQwMDowMDowMi4wMDBaJyxcbiAgICAgIH0sXG4gICAgXSk7XG4gIH0pO1xuXG4gIGl0KCdmYWxscyBiYWNrIHRvIHN0b3JhZ2Ugd2hlbiB0aGUgZmlyc3QgYW5hbHl0aWNzIHBhZ2UgaXMgZW1wdHknLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgc3RlcCA9IHtcbiAgICAgIHJ1bklkOiAncnVuLTEnLFxuICAgICAgc3RlcElkOiAnc3RlcC0xJyxcbiAgICAgIHN0ZXBOYW1lOiAnc3RlcC8vLi9zcmMvd29ya2Zsb3dzL3Rlc3QvL2RvV29yaycsXG4gICAgICBzdGF0dXM6ICdjb21wbGV0ZWQnLFxuICAgICAgYXR0ZW1wdDogMSxcbiAgICAgIGlucHV0OiB1bmRlZmluZWQsXG4gICAgICBvdXRwdXQ6IHVuZGVmaW5lZCxcbiAgICAgIGNyZWF0ZWRBdDogbmV3IERhdGUoJzIwMjYtMDYtMzBUMDA6MDA6MDAuMDAwWicpLFxuICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgnMjAyNi0wNi0zMFQwMDowMDowMi4wMDBaJyksXG4gICAgICBzdGFydGVkQXQ6IG5ldyBEYXRlKCcyMDI2LTA2LTMwVDAwOjAwOjAxLjAwMFonKSxcbiAgICAgIGNvbXBsZXRlZEF0OiBuZXcgRGF0ZSgnMjAyNi0wNi0zMFQwMDowMDowMi4wMDBaJyksXG4gICAgfSBzYXRpc2ZpZXMgU3RlcDtcbiAgICBjb25zdCB3b3JsZCA9IHtcbiAgICAgIGFuYWx5dGljczoge1xuICAgICAgICBzdGVwczoge1xuICAgICAgICAgIGxpc3Q6IHZpLmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoe1xuICAgICAgICAgICAgZGF0YTogW10sXG4gICAgICAgICAgICBjdXJzb3I6IG51bGwsXG4gICAgICAgICAgICBoYXNNb3JlOiBmYWxzZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBzdGVwczoge1xuICAgICAgICBsaXN0OiB2aS5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKHtcbiAgICAgICAgICBkYXRhOiBbc3RlcF0sXG4gICAgICAgICAgY3Vyc29yOiBudWxsLFxuICAgICAgICAgIGhhc01vcmU6IGZhbHNlLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgfSBhcyB1bmtub3duIGFzIFdvcmxkO1xuICAgIGNvbnN0IHdyaXRlID0gdmlcbiAgICAgIC5zcHlPbihwcm9jZXNzLnN0ZG91dCwgJ3dyaXRlJylcbiAgICAgIC5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gdHJ1ZSk7XG5cbiAgICBhd2FpdCBsaXN0U3RlcHMod29ybGQsIHsganNvbjogdHJ1ZSwgcnVuSWQ6ICdydW4tMScgfSk7XG5cbiAgICBleHBlY3Qod29ybGQuYW5hbHl0aWNzPy5zdGVwcy5saXN0KS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgZXhwZWN0KHdvcmxkLnN0ZXBzLmxpc3QpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHtcbiAgICAgIHJ1bklkOiAncnVuLTEnLFxuICAgICAgcGFnaW5hdGlvbjoge1xuICAgICAgICBzb3J0T3JkZXI6ICdkZXNjJyxcbiAgICAgICAgY3Vyc29yOiB1bmRlZmluZWQsXG4gICAgICAgIGxpbWl0OiAyMCxcbiAgICAgIH0sXG4gICAgICByZXNvbHZlRGF0YTogJ25vbmUnLFxuICAgIH0pO1xuICAgIGV4cGVjdChKU09OLnBhcnNlKFN0cmluZyh3cml0ZS5tb2NrLmNhbGxzWzBdWzBdKSkpLnRvRXF1YWwoW1xuICAgICAge1xuICAgICAgICAuLi5zdGVwLFxuICAgICAgICBjcmVhdGVkQXQ6ICcyMDI2LTA2LTMwVDAwOjAwOjAwLjAwMFonLFxuICAgICAgICB1cGRhdGVkQXQ6ICcyMDI2LTA2LTMwVDAwOjAwOjAyLjAwMFonLFxuICAgICAgICBzdGFydGVkQXQ6ICcyMDI2LTA2LTMwVDAwOjAwOjAxLjAwMFonLFxuICAgICAgICBjb21wbGV0ZWRBdDogJzIwMjYtMDYtMzBUMDA6MDA6MDIuMDAwWicsXG4gICAgICB9LFxuICAgIF0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnbGlzdEV2ZW50cycsICgpID0+IHtcbiAgaXQoJ3Bhc3NlcyBjdXJzb3JzIGFuZCBwcmVzZXJ2ZXMgdGhlIEpTT04gYXJyYXkgb3V0cHV0JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgcnVuSWQ6ICdydW4tMScsXG4gICAgICBldmVudElkOiAnZXZlbnQtMScsXG4gICAgICBldmVudFR5cGU6ICdzdGVwX2NvbXBsZXRlZCcsXG4gICAgICBjb3JyZWxhdGlvbklkOiAnc3RlcC0xJyxcbiAgICAgIGVudGl0eUlkOiAnc3RlcC0xJyxcbiAgICAgIHN0ZXBOYW1lOiAnZG9Xb3JrJyxcbiAgICAgIHdvcmtmbG93TmFtZTogJ3dvcmtmbG93Ly8uL3NyYy93b3JrZmxvd3MvdGVzdC8vbXlXb3JrZmxvdycsXG4gICAgICBkZXBsb3ltZW50SWQ6ICdkZXAtMScsXG4gICAgICBzcGVjVmVyc2lvbjogMixcbiAgICAgIHJ1bkNyZWF0ZWRBdDogbmV3IERhdGUoJzIwMjYtMDYtMzBUMDA6MDA6MDAuMDAwWicpLFxuICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgnMjAyNi0wNi0zMFQwMDowMDowMi4wMDBaJyksXG4gICAgICByZWdpb246IG51bGwsXG4gICAgICB2ZXJjZWxJZDogbnVsbCxcbiAgICAgIHJlcXVlc3RJZDogbnVsbCxcbiAgICAgIHJlc3VtZUF0OiBudWxsLFxuICAgICAgcmV0cnlBZnRlcjogbnVsbCxcbiAgICAgIGVycm9yQ29kZTogbnVsbCxcbiAgICAgIHdvcmtmbG93Q29yZVZlcnNpb246IG51bGwsXG4gICAgICBpc1dlYmhvb2s6IGZhbHNlLFxuICAgICAgaXNTeXN0ZW06IGZhbHNlLFxuICAgICAgd29ya2Zsb3dFbmNyeXB0aW9uRW5hYmxlZDogZmFsc2UsXG4gICAgfSBzYXRpc2ZpZXMgQW5hbHl0aWNzRXZlbnQ7XG4gICAgY29uc3Qgd29ybGQgPSB7XG4gICAgICBhbmFseXRpY3M6IHtcbiAgICAgICAgZXZlbnRzOiB7XG4gICAgICAgICAgbGlzdDogdmkuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XG4gICAgICAgICAgICBkYXRhOiBbZXZlbnRdLFxuICAgICAgICAgICAgY3Vyc29yOiAnbmV4dC1ldmVudC1jdXJzb3InLFxuICAgICAgICAgICAgaGFzTW9yZTogdHJ1ZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSBhcyB1bmtub3duIGFzIFdvcmxkO1xuICAgIGNvbnN0IHdyaXRlID0gdmlcbiAgICAgIC5zcHlPbihwcm9jZXNzLnN0ZG91dCwgJ3dyaXRlJylcbiAgICAgIC5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gdHJ1ZSk7XG5cbiAgICBhd2FpdCBsaXN0RXZlbnRzKHdvcmxkLCB7XG4gICAgICBqc29uOiB0cnVlLFxuICAgICAgcnVuSWQ6ICdydW4tMScsXG4gICAgICBjdXJzb3I6ICdldmVudC1jdXJzb3InLFxuICAgICAgbGltaXQ6IDEsXG4gICAgfSk7XG5cbiAgICBleHBlY3Qod29ybGQuYW5hbHl0aWNzPy5ldmVudHMubGlzdCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoe1xuICAgICAgcnVuSWQ6ICdydW4tMScsXG4gICAgICBjb3JyZWxhdGlvbklkOiB1bmRlZmluZWQsXG4gICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgIHNvcnRPcmRlcjogJ2Rlc2MnLFxuICAgICAgICBjdXJzb3I6ICdldmVudC1jdXJzb3InLFxuICAgICAgICBsaW1pdDogMSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgZXhwZWN0KEpTT04ucGFyc2UoU3RyaW5nKHdyaXRlLm1vY2suY2FsbHNbMF1bMF0pKSkudG9FcXVhbChbXG4gICAgICB7XG4gICAgICAgIC4uLmV2ZW50LFxuICAgICAgICBydW5DcmVhdGVkQXQ6ICcyMDI2LTA2LTMwVDAwOjAwOjAwLjAwMFonLFxuICAgICAgICBjcmVhdGVkQXQ6ICcyMDI2LTA2LTMwVDAwOjAwOjAyLjAwMFonLFxuICAgICAgfSxcbiAgICBdKTtcbiAgfSk7XG5cbiAgaXQoJ2ZhbGxzIGJhY2sgdG8gc3RvcmFnZSB3aGVuIHRoZSBmaXJzdCBhbmFseXRpY3MgcGFnZSBpcyBlbXB0eScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBldmVudCA9IHtcbiAgICAgIHJ1bklkOiAncnVuLTEnLFxuICAgICAgZXZlbnRJZDogJ2V2ZW50LTEnLFxuICAgICAgZXZlbnRUeXBlOiAnc3RlcF9jb21wbGV0ZWQnLFxuICAgICAgY29ycmVsYXRpb25JZDogJ3N0ZXAtMScsXG4gICAgICBldmVudERhdGE6IHtcbiAgICAgICAgc3RlcE5hbWU6ICdkb1dvcmsnLFxuICAgICAgICByZXN1bHQ6IHVuZGVmaW5lZCxcbiAgICAgIH0sXG4gICAgICBjcmVhdGVkQXQ6IG5ldyBEYXRlKCcyMDI2LTA2LTMwVDAwOjAwOjAyLjAwMFonKSxcbiAgICB9IGFzIHVua25vd24gYXMgRXZlbnQ7XG4gICAgY29uc3Qgd29ybGQgPSB7XG4gICAgICBhbmFseXRpY3M6IHtcbiAgICAgICAgZXZlbnRzOiB7XG4gICAgICAgICAgbGlzdDogdmkuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XG4gICAgICAgICAgICBkYXRhOiBbXSxcbiAgICAgICAgICAgIGN1cnNvcjogbnVsbCxcbiAgICAgICAgICAgIGhhc01vcmU6IGZhbHNlLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGV2ZW50czoge1xuICAgICAgICBsaXN0OiB2aS5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKHtcbiAgICAgICAgICBkYXRhOiBbZXZlbnRdLFxuICAgICAgICAgIGN1cnNvcjogbnVsbCxcbiAgICAgICAgICBoYXNNb3JlOiBmYWxzZSxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgIH0gYXMgdW5rbm93biBhcyBXb3JsZDtcbiAgICBjb25zdCB3cml0ZSA9IHZpXG4gICAgICAuc3B5T24ocHJvY2Vzcy5zdGRvdXQsICd3cml0ZScpXG4gICAgICAubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHRydWUpO1xuXG4gICAgYXdhaXQgbGlzdEV2ZW50cyh3b3JsZCwgeyBqc29uOiB0cnVlLCBydW5JZDogJ3J1bi0xJyB9KTtcblxuICAgIGV4cGVjdCh3b3JsZC5hbmFseXRpY3M/LmV2ZW50cy5saXN0KS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgZXhwZWN0KHdvcmxkLmV2ZW50cy5saXN0KS50b0hhdmVCZWVuQ2FsbGVkV2l0aCh7XG4gICAgICBydW5JZDogJ3J1bi0xJyxcbiAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgc29ydE9yZGVyOiAnZGVzYycsXG4gICAgICAgIGN1cnNvcjogdW5kZWZpbmVkLFxuICAgICAgICBsaW1pdDogMjAsXG4gICAgICB9LFxuICAgICAgcmVzb2x2ZURhdGE6ICdub25lJyxcbiAgICB9KTtcbiAgICBleHBlY3QoSlNPTi5wYXJzZShTdHJpbmcod3JpdGUubW9jay5jYWxsc1swXVswXSkpKS50b0VxdWFsKFtcbiAgICAgIHtcbiAgICAgICAgLi4uZXZlbnQsXG4gICAgICAgIGNyZWF0ZWRBdDogJzIwMjYtMDYtMzBUMDA6MDA6MDIuMDAwWicsXG4gICAgICB9LFxuICAgIF0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnbGlzdFNsZWVwcycsICgpID0+IHtcbiAgY29uc3Qgd2FpdCA9IHtcbiAgICBydW5JZDogJ3J1bi0xJyxcbiAgICB3YWl0SWQ6ICd3YWl0LTEnLFxuICAgIHN0YXR1czogJ3dhaXRpbmcnLFxuICAgIHJlc3VtZUF0OiBuZXcgRGF0ZSgnMjAyNi0wNi0zMFQwMDowMTowMC4wMDBaJyksXG4gICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgnMjAyNi0wNi0zMFQwMDowMDowMC4wMDBaJyksXG4gICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgnMjAyNi0wNi0zMFQwMDowMDowMC4wMDBaJyksXG4gICAgY29tcGxldGVkQXQ6IG51bGwsXG4gICAgd29ya2Zsb3dDb3JlVmVyc2lvbjogbnVsbCxcbiAgICB3b3JrZmxvd0VuY3J5cHRpb25FbmFibGVkOiBmYWxzZSxcbiAgfSBzYXRpc2ZpZXMgQW5hbHl0aWNzV2FpdDtcbiAgY29uc3QgcGFnZUluZm8gPSB7XG4gICAgY3VycmVudExvb2tiYWNrRGF5czogMixcbiAgICBtYXhMb29rYmFja0RheXM6IDMwLFxuICAgIGN1cnJlbnRXaW5kb3dTdGFydDogbmV3IERhdGUoJzIwMjYtMDYtMjhUMDA6MDA6MDAuMDAwWicpLFxuICAgIG1heFdpbmRvd1N0YXJ0OiBuZXcgRGF0ZSgnMjAyNi0wNi0wMVQwMDowMDowMC4wMDBaJyksXG4gICAgdXBncmFkZUF2YWlsYWJsZTogdHJ1ZSxcbiAgfTtcblxuICBpdCgncGFzc2VzIGN1cnNvcnMgYW5kIHByZXNlcnZlcyB0aGUgSlNPTiBhcnJheSBvdXRwdXQgdGhyb3VnaCBhbmFseXRpY3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgd29ybGQgPSB7XG4gICAgICBhbmFseXRpY3M6IHtcbiAgICAgICAgd2FpdHM6IHtcbiAgICAgICAgICBsaXN0OiB2aS5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKHtcbiAgICAgICAgICAgIGRhdGE6IFt3YWl0XSxcbiAgICAgICAgICAgIGN1cnNvcjogJ25leHQtd2FpdC1jdXJzb3InLFxuICAgICAgICAgICAgaGFzTW9yZTogdHJ1ZSxcbiAgICAgICAgICAgIHBhZ2VJbmZvLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9IGFzIHVua25vd24gYXMgV29ybGQ7XG4gICAgY29uc3Qgd3JpdGUgPSB2aVxuICAgICAgLnNweU9uKHByb2Nlc3Muc3Rkb3V0LCAnd3JpdGUnKVxuICAgICAgLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB0cnVlKTtcblxuICAgIGF3YWl0IGxpc3RTbGVlcHMod29ybGQsIHtcbiAgICAgIGpzb246IHRydWUsXG4gICAgICBydW5JZDogJ3J1bi0xJyxcbiAgICAgIGN1cnNvcjogJ3dhaXQtY3Vyc29yJyxcbiAgICAgIGxpbWl0OiAxLFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KHdvcmxkLmFuYWx5dGljcz8ud2FpdHMubGlzdCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoe1xuICAgICAgcnVuSWQ6ICdydW4tMScsXG4gICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgIHNvcnRPcmRlcjogJ2Rlc2MnLFxuICAgICAgICBjdXJzb3I6ICd3YWl0LWN1cnNvcicsXG4gICAgICAgIGxpbWl0OiAxLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBleHBlY3QoSlNPTi5wYXJzZShTdHJpbmcod3JpdGUubW9jay5jYWxsc1swXVswXSkpKS50b0VxdWFsKFtcbiAgICAgIHtcbiAgICAgICAgLi4ud2FpdCxcbiAgICAgICAgcmVzdW1lQXQ6ICcyMDI2LTA2LTMwVDAwOjAxOjAwLjAwMFonLFxuICAgICAgICBjcmVhdGVkQXQ6ICcyMDI2LTA2LTMwVDAwOjAwOjAwLjAwMFonLFxuICAgICAgICB1cGRhdGVkQXQ6ICcyMDI2LTA2LTMwVDAwOjAwOjAwLjAwMFonLFxuICAgICAgfSxcbiAgICBdKTtcbiAgfSk7XG5cbiAgaXQoJ3N1cmZhY2VzIHRoZSBvYnNlcnZhYmlsaXR5IHVwZ3JhZGUgaGludCBpbiB0YWJsZSBtb2RlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHdvcmxkID0ge1xuICAgICAgYW5hbHl0aWNzOiB7XG4gICAgICAgIHdhaXRzOiB7XG4gICAgICAgICAgbGlzdDogdmkuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XG4gICAgICAgICAgICBkYXRhOiBbd2FpdF0sXG4gICAgICAgICAgICBjdXJzb3I6IG51bGwsXG4gICAgICAgICAgICBoYXNNb3JlOiBmYWxzZSxcbiAgICAgICAgICAgIHBhZ2VJbmZvLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9IGFzIHVua25vd24gYXMgV29ybGQ7XG4gICAgY29uc3QgbG9nID0gdmkuc3B5T24oY29uc29sZSwgJ2xvZycpLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB1bmRlZmluZWQpO1xuXG4gICAgYXdhaXQgbGlzdFNsZWVwcyh3b3JsZCwgeyBydW5JZDogJ3J1bi0xJyB9KTtcblxuICAgIGV4cGVjdChsb2cubW9jay5jYWxscy5mbGF0KCkuam9pbignXFxuJykpLnRvQ29udGFpbihcbiAgICAgICdVcGdyYWRlIE9ic2VydmFiaWxpdHkgUGx1cydcbiAgICApO1xuICB9KTtcbn0pO1xuIl19
@@ -26,7 +26,16 @@ export interface PageData<T> {
26
26
  data: T[];
27
27
  cursor: string | null | undefined;
28
28
  hasMore: boolean;
29
+ pageInfo?: AnalyticsPageInfo;
29
30
  }
31
+ export interface AnalyticsPageInfo {
32
+ currentLookbackDays: number;
33
+ maxLookbackDays: number;
34
+ currentWindowStart: Date | string;
35
+ maxWindowStart: Date | string;
36
+ upgradeAvailable: boolean;
37
+ }
38
+ export declare const getPageInfoUpgradeHint: (pageInfo: AnalyticsPageInfo | undefined) => string | undefined;
30
39
  /**
31
40
  * Generic pagination handler for list operations
32
41
  */
@@ -42,7 +51,7 @@ export interface ListPaginationOptions<TData> {
42
51
  /**
43
52
  * Display function that renders the current page
44
53
  */
45
- displayPage: (data: TData[], pageIndex: number) => void | Promise<void>;
54
+ displayPage: (data: TData[], pageIndex: number, page: PageData<TData>) => void | Promise<void>;
46
55
  /**
47
56
  * Optional callback for when fetching starts
48
57
  */
@@ -1 +1 @@
1
- {"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../../src/lib/inspect/pagination.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,qBAAqB,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,uBAAuB,GAClC,OAAO,eAAe,EACtB,WAAW,mBAAmB,KAC7B,CAAC,MAAM,IAAI,CAwDb,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,OAAO,eAAe,SAsBzD,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,QAAQ,CAAC,CAAC;IACzB,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAClC,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB,CAAC,KAAK;IAC1C;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,KAAK,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAEpE;;OAEG;IACH,WAAW,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAExE;;OAEG;IACH,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAE3C;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAC7C,OAAO,EAAE,qBAAqB,CAAC,KAAK,CAAC,GACpC,OAAO,CAAC,IAAI,CAAC,CA8If"}
1
+ {"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../../src/lib/inspect/pagination.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,qBAAqB,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,uBAAuB,GAClC,OAAO,eAAe,EACtB,WAAW,mBAAmB,KAC7B,CAAC,MAAM,IAAI,CAwDb,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,OAAO,eAAe,SAsBzD,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,QAAQ,CAAC,CAAC;IACzB,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAED,MAAM,WAAW,iBAAiB;IAChC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,IAAI,GAAG,MAAM,CAAC;IAClC,cAAc,EAAE,IAAI,GAAG,MAAM,CAAC;IAC9B,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,eAAO,MAAM,sBAAsB,GACjC,UAAU,iBAAiB,GAAG,SAAS,KACtC,MAAM,GAAG,SASX,CAAC;AAWF;;GAEG;AACH,MAAM,WAAW,qBAAqB,CAAC,KAAK;IAC1C;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,KAAK,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAEpE;;OAEG;IACH,WAAW,EAAE,CACX,IAAI,EAAE,KAAK,EAAE,EACb,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,KAClB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1B;;OAEG;IACH,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAE3C;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAC7C,OAAO,EAAE,qBAAqB,CAAC,KAAK,CAAC,GACpC,OAAO,CAAC,IAAI,CAAC,CAiJf"}
@@ -78,6 +78,19 @@ export const showPaginationState = (state) => {
78
78
  parts.push('[q] Quit (or Ctrl+C)');
79
79
  logger.log(`\n${parts.join(' | ')}`);
80
80
  };
81
+ export const getPageInfoUpgradeHint = (pageInfo) => {
82
+ if (!pageInfo?.upgradeAvailable ||
83
+ pageInfo.currentLookbackDays >= pageInfo.maxLookbackDays) {
84
+ return undefined;
85
+ }
86
+ return `Showing the last ${pageInfo.currentLookbackDays} days of workflow observability data. Upgrade Observability Plus to query up to ${pageInfo.maxLookbackDays} days.`;
87
+ };
88
+ const showPageInfoUpgradeHint = (pageInfo) => {
89
+ const hint = getPageInfoUpgradeHint(pageInfo);
90
+ if (hint) {
91
+ logger.info(hint);
92
+ }
93
+ };
81
94
  /**
82
95
  * Setup pagination for list operations with page caching
83
96
  */
@@ -103,7 +116,8 @@ export async function setupListPagination(options) {
103
116
  if (enableInteractive) {
104
117
  console.clear();
105
118
  }
106
- await displayPage(page.data, index);
119
+ await displayPage(page.data, index, page);
120
+ showPageInfoUpgradeHint(page.pageInfo);
107
121
  return page;
108
122
  };
109
123
  // Fetch and display first page
@@ -135,7 +149,8 @@ export async function setupListPagination(options) {
135
149
  if (enableInteractive) {
136
150
  console.clear();
137
151
  }
138
- await displayPage(cachedPage.data, pageIndex);
152
+ await displayPage(cachedPage.data, pageIndex, cachedPage);
153
+ showPageInfoUpgradeHint(cachedPage.pageInfo);
139
154
  paginationState.cursor = cachedPage.cursor;
140
155
  paginationState.hasMore = cachedPage.hasMore;
141
156
  paginationState.hasPrevious = pageIndex > 0;
@@ -177,7 +192,8 @@ export async function setupListPagination(options) {
177
192
  if (enableInteractive) {
178
193
  console.clear();
179
194
  }
180
- await displayPage(prevPage.data, pageIndex);
195
+ await displayPage(prevPage.data, pageIndex, prevPage);
196
+ showPageInfoUpgradeHint(prevPage.pageInfo);
181
197
  paginationState.cursor = prevPage.cursor;
182
198
  paginationState.hasMore = prevPage.hasMore;
183
199
  paginationState.hasPrevious = pageIndex > 0;
@@ -196,4 +212,4 @@ export async function setupListPagination(options) {
196
212
  // Keep process alive
197
213
  return new Promise(() => { });
198
214
  }
199
- //# sourceMappingURL=pagination.js.map
215
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvaW5zcGVjdC9wYWdpbmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsT0FBTyxRQUFRLE1BQU0sZUFBZSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFpQnBEOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsQ0FDckMsS0FBc0IsRUFDdEIsU0FBOEIsRUFDaEIsRUFBRTtJQUNoQixJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztRQUNyQixPQUFPLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDLHlCQUF5QjtJQUM1QyxDQUFDO0lBRUQsNENBQTRDO0lBQzVDLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN4QixRQUFRLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNDLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxNQUFNLGVBQWUsR0FBRyxLQUFLLEVBQUUsTUFBYyxFQUFFLEdBQVEsRUFBRSxFQUFFO1FBQ3pELElBQUksQ0FBQyxHQUFHO1lBQUUsT0FBTztRQUVqQixjQUFjO1FBQ2QsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3ZELFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNuQixPQUFPO1FBQ1QsQ0FBQztRQUVELG1CQUFtQjtRQUNuQixJQUNFLENBQUMsR0FBRyxDQUFDLElBQUks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QUFXLEdBQUcsU0FBUyxHQUFHLENBQUMsQ0FBQztnQkFDNUMsZUFBZSxDQUFDLFdBQVcsR0FBRyxTQUFTLEdBQUcsQ0FBQyxDQUFDO2dCQUM1QyxlQUFlLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7Z0JBQzFDLGdEQUFnRDtnQkFDaEQsZUFBZSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUMxRSxDQUFDO1lBRUQsbUJBQW1CLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDdkMsQ0FBQztRQUNELE1BQU0sRUFBRSxHQUFHLEVBQUU7WUFDWCxPQUFPLEVBQUUsQ0FBQztZQUNWLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEIsQ0FBQztLQUNGLENBQUMsQ0FBQztJQUVILHFCQUFxQjtJQUNyQixPQUFPLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO0FBQy9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEludGVyYWN0aXZlIHBhZ2luYXRpb24gZm9yIENMSSB0YWJsZXNcbiAqL1xuaW1wb3J0IHJlYWRsaW5lIGZyb20gJ25vZGU6cmVhZGxpbmUnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vY29uZmlnL2xvZy5qcyc7XG5pbXBvcnQgeyBpc0ludGVyYWN0aXZlIH0gZnJvbSAnLi90ZXJtaW5hbC11dGlscy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnaW5hdGlvblN0YXRlIHtcbiAgY3Vyc29yOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICBoYXNNb3JlOiBib29sZWFuO1xuICBoYXNQcmV2aW91czogYm9vbGVhbjtcbiAgY3VycmVudFBhZ2U6IG51bWJlcjtcbiAgdG90YWxQYWdlczogbnVtYmVyO1xuICBoYXNNb3JlUGFnZXNBdmFpbGFibGU6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnaW5hdGlvbkNhbGxiYWNrcyB7XG4gIG9uTmV4dDogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgb25QcmV2aW91czogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgb25FeGl0OiAoKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFNldHVwIGludGVyYWN0aXZlIHBhZ2luYXRpb24gbGlzdGVuZXJcbiAqL1xuZXhwb3J0IGNvbnN0IHNldHVwUGFnaW5hdGlvbkxpc3RlbmVyID0gKFxuICBzdGF0ZTogUGFnaW5hdGlvblN0YXRlLFxuICBjYWxsYmFja3M6IFBhZ2luYXRpb25DYWxsYmFja3Ncbik6ICgoKSA9PiB2b2lkKSA9PiB7XG4gIGlmICghaXNJbnRlcmFjdGl2ZSgpKSB7XG4gICAgcmV0dXJuICgpID0+IHt9OyAvLyBOby1vcCBjbGVhbnVwIGZ1bmN0aW9uXG4gIH1cblxuICAvLyBFbmFibGUgcmF3IG1vZGUgZm9yIGltbWVkaWF0ZSBrZXkgY2FwdHVyZVxuICBpZiAocHJvY2Vzcy5zdGRpbi5pc1RUWSkge1xuICAgIHJlYWRsaW5lLmVtaXRLZXlwcmVzc0V2ZW50cyhwcm9jZXNzLnN0ZGluKTtcbiAgICBwcm9jZXNzLnN0ZGluLnNldFJhd01vZGUodHJ1ZSk7XG4gIH1cblxuICBjb25zdCBrZXlwcmVzc0hhbmRsZXIgPSBhc3luYyAoX2NodW5rOiBzdHJpbmcsIGtleTogYW55KSA9PiB7XG4gICAgaWYgKCFrZXkpIHJldHVybjtcblxuICAgIC8vIEhhbmRsZSBleGl0XG4gICAgaWYgKGtleS5uYW1lID09PSAncScgfHwgKGtleS5jdHJsICYmIGtleS5uYW1lID09PSAnYycpKSB7XG4gICAgICBjYWxsYmFja3Mub25FeGl0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIG5leHQgcGFnZVxuICAgIGlmIChcbiAgICAgIChrZXkubmFtZSA9PT0gJ24nICYmICFrZXkuY3RybCkgfHxcbiAgICAgIGtleS5uYW1lID09PSAncmlnaHQnIHx8XG4gICAgICBrZXkubmFtZSA9PT0gJ2Rvd24nXG4gICAgKSB7XG4gICAgICBpZiAoc3RhdGUuaGFzTW9yZSkge1xuICAgICAgICBhd2FpdCBjYWxsYmFja3Mub25OZXh0KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIud2FybignTm8gbW9yZSBwYWdlcyBhdmFpbGFibGUnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgcHJldmlvdXMgcGFnZVxuICAgIGlmIChcbiAgICAgIChrZXkubmFtZSA9PT0gJ3AnICYmICFrZXkuY3RybCkgfHxcbiAgICAgIGtleS5uYW1lID09PSAnbGVmdCcgfHxcbiAgICAgIGtleS5uYW1lID09PSAndXAnXG4gICAgKSB7XG4gICAgICAvLyBBbHdheXMgYWxsb3cgZ29pbmcgXCJwcmV2aW91c1wiIC0gb24gZmlyc3QgcGFnZSBpdCByZWxvYWRzXG4gICAgICBhd2FpdCBjYWxsYmFja3Mub25QcmV2aW91cygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfTtcblxuICBwcm9jZXNzLnN0ZGluLm9uKCdrZXlwcmVzcycsIGtleXByZXNzSGFuZGxlcik7XG5cbiAgLy8gUmV0dXJuIGNsZWFudXAgZnVuY3Rpb25cbiAgcmV0dXJuICgpID0+IHtcbiAgICBwcm9jZXNzLnN0ZGluLm9mZigna2V5cHJlc3MnLCBrZXlwcmVzc0hhbmRsZXIpO1xuICAgIGlmIChwcm9jZXNzLnN0ZGluLmlzVFRZICYmIHByb2Nlc3Muc3RkaW4uaXNSYXcpIHtcbiAgICAgIHByb2Nlc3Muc3RkaW4uc2V0UmF3TW9kZShmYWxzZSk7XG4gICAgfVxuICAgIHByb2Nlc3Muc3RkaW4ucGF1c2UoKTtcbiAgfTtcbn07XG5cbi8qKlxuICogU2hvdyBwYWdpbmF0aW9uIHN0YXRlIGluZm9cbiAqL1xuZXhwb3J0IGNvbnN0IHNob3dQYWdpbmF0aW9uU3RhdGUgPSAoc3RhdGU6IFBhZ2luYXRpb25TdGF0ZSkgPT4ge1xuICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcblxuICAvLyBTaG93IHBhZ2UgaW5kaWNhdG9yXG4gIC8vIFVzZSBoYXNNb3JlUGFnZXNBdmFpbGFibGUgdG8gZGV0ZXJtaW5lIGlmIHRoZXJlIGFyZSB1bmtub3duIHBhZ2VzIGJleW9uZCB3aGF0IHdlJ3ZlIGxvYWRlZFxuICBjb25zdCBwYWdlSW5kaWNhdG9yID0gc3RhdGUuaGFzTW9yZVBhZ2VzQXZhaWxhYmxlXG4gICAgPyBgUGFnZSAke3N0YXRlLmN1cnJlbnRQYWdlfSBvZiAke3N0YXRlLnRvdGFsUGFnZXN9K2BcbiAgICA6IGBQYWdlICR7c3RhdGUuY3VycmVudFBhZ2V9IG9mICR7c3RhdGUudG90YWxQYWdlc31gO1xuICBwYXJ0cy5wdXNoKHBhZ2VJbmRpY2F0b3IpO1xuXG4gIGlmIChzdGF0ZS5oYXNQcmV2aW91cykge1xuICAgIHBhcnRzLnB1c2goJ1twXSBQcmV2aW91cycpO1xuICB9IGVsc2Uge1xuICAgIHBhcnRzLnB1c2goJ1twXSBSZWxvYWQnKTtcbiAgfVxuXG4gIGlmIChzdGF0ZS5oYXNNb3JlKSB7XG4gICAgcGFydHMucHVzaCgnW25dIE5leHQnKTtcbiAgfVxuXG4gIHBhcnRzLnB1c2goJ1txXSBRdWl0IChvciBDdHJsK0MpJyk7XG4gIGxvZ2dlci5sb2coYFxcbiR7cGFydHMuam9pbignIHwgJyl9YCk7XG59O1xuXG4vKipcbiAqIFBhZ2UgZGF0YSBzdHJ1Y3R1cmUgZm9yIGNhY2hpbmcgcGFnaW5hdGVkIHJlc3VsdHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYWdlRGF0YTxUPiB7XG4gIGRhdGE6IFRbXTtcbiAgY3Vyc29yOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICBoYXNNb3JlOiBib29sZWFuO1xuICBwYWdlSW5mbz86IEFuYWx5dGljc1BhZ2VJbmZvO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFuYWx5dGljc1BhZ2VJbmZvIHtcbiAgY3VycmVudExvb2tiYWNrRGF5czogbnVtYmVyO1xuICBtYXhMb29rYmFja0RheXM6IG51bWJlcjtcbiAgY3VycmVudFdpbmRvd1N0YXJ0OiBEYXRlIHwgc3RyaW5nO1xuICBtYXhXaW5kb3dTdGFydDogRGF0ZSB8IHN0cmluZztcbiAgdXBncmFkZUF2YWlsYWJsZTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IGdldFBhZ2VJbmZvVXBncmFkZUhpbnQgPSAoXG4gIHBhZ2VJbmZvOiBBbmFseXRpY3NQYWdlSW5mbyB8IHVuZGVmaW5lZFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKFxuICAgICFwYWdlSW5mbz8udXBncmFkZUF2YWlsYWJsZSB8fFxuICAgIHBhZ2VJbmZvLmN1cnJlbnRMb29rYmFja0RheXMgPj0gcGFnZUluZm8ubWF4TG9va2JhY2tEYXlzXG4gICkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4gYFNob3dpbmcgdGhlIGxhc3QgJHtwYWdlSW5mby5jdXJyZW50TG9va2JhY2tEYXlzfSBkYXlzIG9mIHdvcmtmbG93IG9ic2VydmFiaWxpdHkgZGF0YS4gVXBncmFkZSBPYnNlcnZhYmlsaXR5IFBsdXMgdG8gcXVlcnkgdXAgdG8gJHtwYWdlSW5mby5tYXhMb29rYmFja0RheXN9IGRheXMuYDtcbn07XG5cbmNvbnN0IHNob3dQYWdlSW5mb1VwZ3JhZGVIaW50ID0gKFxuICBwYWdlSW5mbzogQW5hbHl0aWNzUGFnZUluZm8gfCB1bmRlZmluZWRcbik6IHZvaWQgPT4ge1xuICBjb25zdCBoaW50ID0gZ2V0UGFnZUluZm9VcGdyYWRlSGludChwYWdlSW5mbyk7XG4gIGlmIChoaW50KSB7XG4gICAgbG9nZ2VyLmluZm8oaGludCk7XG4gIH1cbn07XG5cbi8qKlxuICogR2VuZXJpYyBwYWdpbmF0aW9uIGhhbmRsZXIgZm9yIGxpc3Qgb3BlcmF0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpc3RQYWdpbmF0aW9uT3B0aW9uczxURGF0YT4ge1xuICAvKipcbiAgICogSW5pdGlhbCBjdXJzb3IgZnJvbSBDTEkgb3B0aW9uc1xuICAgKi9cbiAgaW5pdGlhbEN1cnNvcj86IHN0cmluZztcblxuICAvKipcbiAgICogRmV0Y2ggZnVuY3Rpb24gdGhhdCByZXR1cm5zIHBhZ2luYXRlZCBkYXRhXG4gICAqL1xuICBmZXRjaFBhZ2U6IChjdXJzb3I6IHN0cmluZyB8IHVuZGVmaW5lZCkgPT4gUHJvbWlzZTxQYWdlRGF0YTxURGF0YT4+O1xuXG4gIC8qKlxuICAgKiBEaXNwbGF5IGZ1bmN0aW9uIHRoYXQgcmVuZGVycyB0aGUgY3VycmVudCBwYWdlXG4gICAqL1xuICBkaXNwbGF5UGFnZTogKFxuICAgIGRhdGE6IFREYXRhW10sXG4gICAgcGFnZUluZGV4OiBudW1iZXIsXG4gICAgcGFnZTogUGFnZURhdGE8VERhdGE+XG4gICkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGNhbGxiYWNrIGZvciB3aGVuIGZldGNoaW5nIHN0YXJ0c1xuICAgKi9cbiAgb25GZXRjaFN0YXJ0PzogKHBhZ2VJbmRleDogbnVtYmVyKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBFbmFibGUgaW50ZXJhY3RpdmUgcGFnaW5hdGlvbiB3aXRoIGtleWJvYXJkIGNvbnRyb2xzXG4gICAqL1xuICBpbnRlcmFjdGl2ZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogU2V0dXAgcGFnaW5hdGlvbiBmb3IgbGlzdCBvcGVyYXRpb25zIHdpdGggcGFnZSBjYWNoaW5nXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cExpc3RQYWdpbmF0aW9uPFREYXRhPihcbiAgb3B0aW9uczogTGlzdFBhZ2luYXRpb25PcHRpb25zPFREYXRhPlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgaW5pdGlhbEN1cnNvciwgZmV0Y2hQYWdlLCBkaXNwbGF5UGFnZSwgb25GZXRjaFN0YXJ0LCBpbnRlcmFjdGl2ZSB9ID1cbiAgICBvcHRpb25zO1xuXG4gIC8vIEludGVyYWN0aXZlIG1vZGUgcmVxdWlyZXMgYm90aCBUVFkgc3VwcG9ydCBhbmQgZXhwbGljaXQgLS1pbnRlcmFjdGl2ZSBmbGFnXG4gIGNvbnN0IGVuYWJsZUludGVyYWN0aXZlID0gaW50ZXJhY3RpdmUgJiYgaXNJbnRlcmFjdGl2ZSgpO1xuXG4gIC8vIFBhZ2VzIHN0YWNrIC0gc3RvcmVzIGFsbCBmZXRjaGVkIHBhZ2VzXG4gIGNvbnN0IHBhZ2VzOiBQYWdlRGF0YTxURGF0YT5bXSA9IFtdO1xuXG4gIC8vIEN1cnJlbnQgcGFnZSBpbmRleCAoMC1iYXNlZClcbiAgbGV0IHBhZ2VJbmRleCA9IDA7XG5cbiAgLyoqXG4gICAqIEZldGNoIGFuZCBkaXNwbGF5IGEgc3BlY2lmaWMgcGFnZVxuICAgKi9cbiAgY29uc3Qgc2hvd1BhZ2UgPSBhc3luYyAoaW5kZXg6IG51bWJlciwgY3Vyc29yPzogc3RyaW5nKSA9PiB7XG4gICAgaWYgKG9uRmV0Y2hTdGFydCkge1xuICAgICAgb25GZXRjaFN0YXJ0KGluZGV4KTtcbiAgICB9XG5cbiAgICBjb25zdCBwYWdlID0gYXdhaXQgZmV0Y2hQYWdlKGN1cnNvcik7XG4gICAgcGFnZXNbaW5kZXhdID0gcGFnZTtcbiAgICBwYWdlSW5kZXggPSBpbmRleDtcblxuICAgIC8vIENsZWFyIHNjcmVlbiBmb3Igc3Vic2VxdWVudCBwYWdlcyBpbiBpbnRlcmFjdGl2ZSBtb2RlXG4gICAgaWYgKGVuYWJsZUludGVyYWN0aXZlKSB7XG4gICAgICBjb25zb2xlLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgYXdhaXQgZGlzcGxheVBhZ2UocGFnZS5kYXRhLCBpbmRleCwgcGFnZSk7XG4gICAgc2hvd1BhZ2VJbmZvVXBncmFkZUhpbnQocGFnZS5wYWdlSW5mbyk7XG4gICAgcmV0dXJuIHBhZ2U7XG4gIH07XG5cbiAgLy8gRmV0Y2ggYW5kIGRpc3BsYXkgZmlyc3QgcGFnZVxuICBjb25zdCBmaXJzdFBhZ2UgPSBhd2FpdCBzaG93UGFnZSgwLCBpbml0aWFsQ3Vyc29yKTtcblxuICAvLyBJbiBub24taW50ZXJhY3RpdmUgbW9kZSwgc2hvdyBpbmZvIGlmIHRoZXJlIGFyZSBtb3JlIHBhZ2VzXG4gIGlmICghZW5hYmxlSW50ZXJhY3RpdmUpIHtcbiAgICBpZiAoZmlyc3RQYWdlLmhhc01vcmUpIHtcbiAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAnXFxuTW9yZSByZXN1bHRzIGF2YWlsYWJsZS4gVXNlIC0taW50ZXJhY3RpdmUgKC1pKSB0byBwYWdpbmF0ZSB0aHJvdWdoIHJlc3VsdHMuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gU2V0dXAgcGFnaW5hdGlvbiBzdGF0ZVxuICBjb25zdCBwYWdpbmF0aW9uU3RhdGU6IFBhZ2luYXRpb25TdGF0ZSA9IHtcbiAgICBjdXJzb3I6IGZpcnN0UGFnZS5jdXJzb3IsXG4gICAgaGFzTW9yZTogZmlyc3RQYWdlLmhhc01vcmUsXG4gICAgaGFzUHJldmlvdXM6IGZhbHNlLFxuICAgIGN1cnJlbnRQYWdlOiAxLFxuICAgIHRvdGFsUGFnZXM6IDEsXG4gICAgaGFzTW9yZVBhZ2VzQXZhaWxhYmxlOiBmaXJzdFBhZ2UuaGFzTW9yZSxcbiAgfTtcblxuICBzaG93UGFnaW5hdGlvblN0YXRlKHBhZ2luYXRpb25TdGF0ZSk7XG5cbiAgY29uc3QgY2xlYW51cCA9IHNldHVwUGFnaW5hdGlvbkxpc3RlbmVyKHBhZ2luYXRpb25TdGF0ZSwge1xuICAgIG9uTmV4dDogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgbmV3UGFnZUluZGV4ID0gcGFnZUluZGV4ICsgMTtcblxuICAgICAgLy8gQ2hlY2sgaWYgd2UgYWxyZWFkeSBoYXZlIHRoaXMgcGFnZSBjYWNoZWRcbiAgICAgIGlmIChwYWdlc1tuZXdQYWdlSW5kZXhdKSB7XG4gICAgICAgIHBhZ2VJbmRleCA9IG5ld1BhZ2VJbmRleDtcbiAgICAgICAgY29uc3QgY2FjaGVkUGFnZSA9IHBhZ2VzW25ld1BhZ2VJbmRleF07XG5cbiAgICAgICAgaWYgKGVuYWJsZUludGVyYWN0aXZlKSB7XG4gICAgICAgICAgY29uc29sZS5jbGVhcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgZGlzcGxheVBhZ2UoY2FjaGVkUGFnZS5kYXRhLCBwYWdlSW5kZXgsIGNhY2hlZFBhZ2UpO1xuICAgICAgICBzaG93UGFnZUluZm9VcGdyYWRlSGludChjYWNoZWRQYWdlLnBhZ2VJbmZvKTtcblxuICAgICAgICBwYWdpbmF0aW9uU3RhdGUuY3Vyc29yID0gY2FjaGVkUGFnZS5jdXJzb3I7XG4gICAgICAgIHBhZ2luYXRpb25TdGF0ZS5oYXNNb3JlID0gY2FjaGVkUGFnZS5oYXNNb3JlO1xuICAgICAgICBwYWdpbmF0aW9uU3RhdGUuaGFzUHJldmlvdXMgPSBwYWdlSW5kZXggPiAwO1xuICAgICAgICBwYWdpbmF0aW9uU3RhdGUuY3VycmVudFBhZ2UgPSBwYWdlSW5kZXggKyAxO1xuICAgICAgICBwYWdpbmF0aW9uU3RhdGUudG90YWxQYWdlcyA9IHBhZ2VzLmxlbmd0aDtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGxhc3QgcGFnZSBpbiBjYWNoZSBoYXMgbW9yZSBkYXRhXG4gICAgICAgIHBhZ2luYXRpb25TdGF0ZS5oYXNNb3JlUGFnZXNBdmFpbGFibGUgPSBwYWdlc1twYWdlcy5sZW5ndGggLSAxXS5oYXNNb3JlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRmV0Y2ggbmV3IHBhZ2UgdXNpbmcgY3Vyc29yIGZyb20gY3VycmVudCBwYWdlXG4gICAgICAgIGNvbnN0IGN1cnJlbnRQYWdlID0gcGFnZXNbcGFnZUluZGV4XTtcbiAgICAgICAgY29uc3QgbmV4dFBhZ2UgPSBhd2FpdCBzaG93UGFnZShcbiAgICAgICAgICBuZXdQYWdlSW5kZXgsXG4gICAgICAgICAgY3VycmVudFBhZ2UuY3Vyc29yIHx8IHVuZGVmaW5lZFxuICAgICAgICApO1xuXG4gICAgICAgIHBhZ2luYXRpb25TdGF0ZS5jdXJzb3IgPSBuZXh0UGFnZS5jdXJzb3I7XG4gICAgICAgIHBhZ2luYXRpb25TdGF0ZS5oYXNNb3JlID0gbmV4dFBhZ2UuaGFzTW9yZTtcbiAgICAgICAgcGFnaW5hdGlvblN0YXRlLmhhc1ByZXZpb3VzID0gcGFnZUluZGV4ID4gMDtcbiAgICAgICAgcGFnaW5hdGlvblN0YXRlLmN1cnJlbnRQYWdlID0gcGFnZUluZGV4ICsgMTtcbiAgICAgICAgcGFnaW5hdGlvblN0YXRlLnRvdGFsUGFnZXMgPSBwYWdlcy5sZW5ndGg7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBsYXN0IHBhZ2UgaW4gY2FjaGUgaGFzIG1vcmUgZGF0YVxuICAgICAgICBwYWdpbmF0aW9uU3RhdGUuaGFzTW9yZVBhZ2VzQXZhaWxhYmxlID0gcGFnZXNbcGFnZXMubGVuZ3RoIC0gMV0uaGFzTW9yZTtcbiAgICAgIH1cblxuICAgICAgc2hvd1BhZ2luYXRpb25TdGF0ZShwYWdpbmF0aW9uU3RhdGUpO1xuICAgIH0sXG4gICAgb25QcmV2aW91czogYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gU3BlY2lhbCBjYXNlOiBvbiBmaXJzdCBwYWdlLCByZWxvYWRcbiAgICAgIGlmIChwYWdlSW5kZXggPT09IDApIHtcbiAgICAgICAgcGFnZXMubGVuZ3RoID0gMDsgLy8gQ2xlYXIgY2FjaGVcbiAgICAgICAgY29uc3QgcmVsb2FkZWRQYWdlID0gYXdhaXQgc2hvd1BhZ2UoMCwgaW5pdGlhbEN1cnNvcik7XG5cbiAgICAgICAgcGFnaW5hdGlvblN0YXRlLmN1cnNvciA9IHJlbG9hZGVkUGFnZS5jdXJzb3I7XG4gICAgICAgIHBhZ2luYXRpb25TdGF0ZS5oYXNNb3JlID0gcmVsb2FkZWRQYWdlLmhhc01vcmU7XG4gICAgICAgIHBhZ2luYXRpb25TdGF0ZS5oYXNQcmV2aW91cyA9IGZhbHNlO1xuICAgICAgICBwYWdpbmF0aW9uU3RhdGUuY3VycmVudFBhZ2UgPSAxO1xuICAgICAgICBwYWdpbmF0aW9uU3RhdGUudG90YWxQYWdlcyA9IDE7XG4gICAgICAgIHBhZ2luYXRpb25TdGF0ZS5oYXNNb3JlUGFnZXNBdmFpbGFibGUgPSByZWxvYWRlZFBhZ2UuaGFzTW9yZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEdvIHRvIHByZXZpb3VzIGNhY2hlZCBwYWdlXG4gICAgICAgIHBhZ2VJbmRleC0tO1xuICAgICAgICBjb25zdCBwcmV2UGFnZSA9IHBhZ2VzW3BhZ2VJbmRleF07XG5cbiAgICAgICAgaWYgKGVuYWJsZUludGVyYWN0aXZlKSB7XG4gICAgICAgICAgY29uc29sZS5jbGVhcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgZGlzcGxheVBhZ2UocHJldlBhZ2UuZGF0YSwgcGFnZUluZGV4LCBwcmV2UGFnZSk7XG4gICAgICAgIHNob3dQYWdlSW5mb1VwZ3JhZGVIaW50KHByZXZQYWdlLnBhZ2VJbmZvKTtcblxuICAgICAgICBwYWdpbmF0aW9uU3RhdGUuY3Vyc29yID0gcHJldlBhZ2UuY3Vyc29yO1xuICAgICAgICBwYWdpbmF0aW9uU3RhdGUuaGFzTW9yZSA9IHByZXZQYWdlLmhhc01vcmU7XG4gICAgICAgIHBhZ2luYXRpb25TdGF0ZS5oYXNQcmV2aW91cyA9IHBhZ2VJbmRleCA+IDA7XG4gICAgICAgIHBhZ2luYXRpb25TdGF0ZS5jdXJyZW50UGFnZSA9IHBhZ2VJbmRleCArIDE7XG4gICAgICAgIHBhZ2luYXRpb25TdGF0ZS50b3RhbFBhZ2VzID0gcGFnZXMubGVuZ3RoO1xuICAgICAgICAvLyBDaGVjayBpZiB0aGUgbGFzdCBwYWdlIGluIGNhY2hlIGhhcyBtb3JlIGRhdGFcbiAgICAgICAgcGFnaW5hdGlvblN0YXRlLmhhc01vcmVQYWdlc0F2YWlsYWJsZSA9IHBhZ2VzW3BhZ2VzLmxlbmd0aCAtIDFdLmhhc01vcmU7XG4gICAgICB9XG5cbiAgICAgIHNob3dQYWdpbmF0aW9uU3RhdGUocGFnaW5hdGlvblN0YXRlKTtcbiAgICB9LFxuICAgIG9uRXhpdDogKCkgPT4ge1xuICAgICAgY2xlYW51cCgpO1xuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH0sXG4gIH0pO1xuXG4gIC8vIEtlZXAgcHJvY2VzcyBhbGl2ZVxuICByZXR1cm4gbmV3IFByb21pc2UoKCkgPT4ge30pO1xufVxuIl19
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/lib/inspect/run.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAe,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAG1D,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAaD,eAAO,MAAM,QAAQ,GACnB,OAAO,KAAK,EACZ,qBAAqB,MAAM,EAC3B,MAAM,aAAa,EACnB,MAAM,MAAM,EAAE,kBA8Df,CAAC"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/lib/inspect/run.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAI7C,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAaD,eAAO,MAAM,QAAQ,GACnB,OAAO,KAAK,EACZ,qBAAqB,MAAM,EAC3B,MAAM,aAAa,EACnB,MAAM,MAAM,EAAE,kBAuFf,CAAC"}