@posthog/wizard 2.0.2 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/dist/bin.js +27 -4
  2. package/dist/bin.js.map +1 -1
  3. package/dist/src/__tests__/cli.test.js +50 -3
  4. package/dist/src/__tests__/cli.test.js.map +1 -1
  5. package/dist/src/__tests__/package-json.test.d.ts +1 -0
  6. package/dist/src/__tests__/package-json.test.js +173 -0
  7. package/dist/src/__tests__/package-json.test.js.map +1 -0
  8. package/dist/src/__tests__/run.test.js +4 -2
  9. package/dist/src/__tests__/run.test.js.map +1 -1
  10. package/dist/src/lib/__tests__/agent-interface.test.js +3 -1
  11. package/dist/src/lib/__tests__/agent-interface.test.js.map +1 -1
  12. package/dist/src/lib/__tests__/yara-hooks.test.d.ts +1 -0
  13. package/dist/src/lib/__tests__/yara-hooks.test.js +432 -0
  14. package/dist/src/lib/__tests__/yara-hooks.test.js.map +1 -0
  15. package/dist/src/lib/__tests__/yara-scanner.test.d.ts +1 -0
  16. package/dist/src/lib/__tests__/yara-scanner.test.js +613 -0
  17. package/dist/src/lib/__tests__/yara-scanner.test.js.map +1 -0
  18. package/dist/src/lib/agent-interface.d.ts +6 -3
  19. package/dist/src/lib/agent-interface.js +70 -34
  20. package/dist/src/lib/agent-interface.js.map +1 -1
  21. package/dist/src/lib/agent-runner.js +60 -23
  22. package/dist/src/lib/agent-runner.js.map +1 -1
  23. package/dist/src/lib/commandments.js +3 -1
  24. package/dist/src/lib/commandments.js.map +1 -1
  25. package/dist/src/lib/constants.d.ts +4 -3
  26. package/dist/src/lib/constants.js +3 -2
  27. package/dist/src/lib/constants.js.map +1 -1
  28. package/dist/src/lib/health-checks/readiness.d.ts +5 -0
  29. package/dist/src/lib/health-checks/readiness.js +79 -19
  30. package/dist/src/lib/health-checks/readiness.js.map +1 -1
  31. package/dist/src/lib/skill-install.d.ts +10 -0
  32. package/dist/src/lib/skill-install.js +23 -0
  33. package/dist/src/lib/skill-install.js.map +1 -0
  34. package/dist/src/lib/version.d.ts +1 -1
  35. package/dist/src/lib/version.js +1 -1
  36. package/dist/src/lib/version.js.map +1 -1
  37. package/dist/src/lib/wizard-session.d.ts +5 -4
  38. package/dist/src/lib/wizard-session.js +3 -1
  39. package/dist/src/lib/wizard-session.js.map +1 -1
  40. package/dist/src/lib/wizard-tools.d.ts +2 -0
  41. package/dist/src/lib/wizard-tools.js +119 -2
  42. package/dist/src/lib/wizard-tools.js.map +1 -1
  43. package/dist/src/lib/yara-hooks.d.ts +44 -0
  44. package/dist/src/lib/yara-hooks.js +377 -0
  45. package/dist/src/lib/yara-hooks.js.map +1 -0
  46. package/dist/src/lib/yara-scanner.d.ts +61 -0
  47. package/dist/src/lib/yara-scanner.js +328 -0
  48. package/dist/src/lib/yara-scanner.js.map +1 -0
  49. package/dist/src/run.d.ts +3 -0
  50. package/dist/src/run.js +10 -0
  51. package/dist/src/run.js.map +1 -1
  52. package/dist/src/steps/add-mcp-server-to-clients/index.d.ts +2 -1
  53. package/dist/src/steps/add-mcp-server-to-clients/index.js +1 -1
  54. package/dist/src/steps/add-mcp-server-to-clients/index.js.map +1 -1
  55. package/dist/src/ui/logging-ui.d.ts +2 -4
  56. package/dist/src/ui/logging-ui.js +12 -4
  57. package/dist/src/ui/logging-ui.js.map +1 -1
  58. package/dist/src/ui/tui/__tests__/store.test.js +81 -29
  59. package/dist/src/ui/tui/__tests__/store.test.js.map +1 -1
  60. package/dist/src/ui/tui/components/ServiceHealthList.d.ts +15 -0
  61. package/dist/src/ui/tui/components/ServiceHealthList.js +57 -0
  62. package/dist/src/ui/tui/components/ServiceHealthList.js.map +1 -0
  63. package/dist/src/ui/tui/flows.d.ts +1 -0
  64. package/dist/src/ui/tui/flows.js +12 -0
  65. package/dist/src/ui/tui/flows.js.map +1 -1
  66. package/dist/src/ui/tui/ink-ui.d.ts +2 -4
  67. package/dist/src/ui/tui/ink-ui.js +8 -4
  68. package/dist/src/ui/tui/ink-ui.js.map +1 -1
  69. package/dist/src/ui/tui/playground/PlaygroundApp.js +12 -0
  70. package/dist/src/ui/tui/playground/PlaygroundApp.js.map +1 -1
  71. package/dist/src/ui/tui/playground/demos/HealthCheckDemo.d.ts +11 -0
  72. package/dist/src/ui/tui/playground/demos/HealthCheckDemo.js +56 -0
  73. package/dist/src/ui/tui/playground/demos/HealthCheckDemo.js.map +1 -0
  74. package/dist/src/ui/tui/playground/demos/ModalDemo.d.ts +6 -0
  75. package/dist/src/ui/tui/playground/demos/ModalDemo.js +13 -0
  76. package/dist/src/ui/tui/playground/demos/ModalDemo.js.map +1 -0
  77. package/dist/src/ui/tui/primitives/ModalOverlay.d.ts +25 -0
  78. package/dist/src/ui/tui/primitives/ModalOverlay.js +7 -0
  79. package/dist/src/ui/tui/primitives/ModalOverlay.js.map +1 -0
  80. package/dist/src/ui/tui/primitives/ProgressList.js +3 -1
  81. package/dist/src/ui/tui/primitives/ProgressList.js.map +1 -1
  82. package/dist/src/ui/tui/primitives/index.d.ts +1 -0
  83. package/dist/src/ui/tui/primitives/index.js +1 -0
  84. package/dist/src/ui/tui/primitives/index.js.map +1 -1
  85. package/dist/src/ui/tui/router.d.ts +0 -1
  86. package/dist/src/ui/tui/router.js +0 -1
  87. package/dist/src/ui/tui/router.js.map +1 -1
  88. package/dist/src/ui/tui/screen-registry.js +2 -2
  89. package/dist/src/ui/tui/screen-registry.js.map +1 -1
  90. package/dist/src/ui/tui/screens/PortConflictScreen.js +13 -13
  91. package/dist/src/ui/tui/screens/PortConflictScreen.js.map +1 -1
  92. package/dist/src/ui/tui/screens/SettingsOverrideScreen.js +8 -8
  93. package/dist/src/ui/tui/screens/SettingsOverrideScreen.js.map +1 -1
  94. package/dist/src/ui/tui/screens/health/HealthCheckScreen.d.ts +14 -0
  95. package/dist/src/ui/tui/screens/health/HealthCheckScreen.js +32 -0
  96. package/dist/src/ui/tui/screens/health/HealthCheckScreen.js.map +1 -0
  97. package/dist/src/ui/tui/store.d.ts +15 -5
  98. package/dist/src/ui/tui/store.js +47 -3
  99. package/dist/src/ui/tui/store.js.map +1 -1
  100. package/dist/src/ui/wizard-ui.d.ts +4 -5
  101. package/dist/src/ui/wizard-ui.js.map +1 -1
  102. package/dist/src/utils/__tests__/setup-utils.test.js +2 -1
  103. package/dist/src/utils/__tests__/setup-utils.test.js.map +1 -1
  104. package/dist/src/utils/rules/universal.md +12 -0
  105. package/dist/src/utils/types.d.ts +9 -0
  106. package/dist/src/utils/types.js.map +1 -1
  107. package/package.json +2 -2
  108. package/dist/src/ui/tui/screens/OutageScreen.d.ts +0 -10
  109. package/dist/src/ui/tui/screens/OutageScreen.js +0 -17
  110. package/dist/src/ui/tui/screens/OutageScreen.js.map +0 -1
@@ -1,5 +1,6 @@
1
1
  import { WizardStore, TaskStatus, Flow, Screen, Overlay, RunPhase, McpOutcome, } from '../store.js';
2
2
  import { OutroKind, AdditionalFeature } from '../../../lib/wizard-session.js';
3
+ import { WizardReadiness } from '../../../lib/health-checks/readiness.js';
3
4
  import { buildSession } from '../../../lib/wizard-session.js';
4
5
  import { Integration } from '../../../lib/constants.js';
5
6
  import { analytics } from '../../../utils/analytics.js';
@@ -12,6 +13,19 @@ jest.mock('../../../utils/analytics.js', () => ({
12
13
  },
13
14
  sessionProperties: jest.fn(() => ({})),
14
15
  }));
16
+ jest.mock('../../../lib/health-checks/readiness.js', () => ({
17
+ evaluateWizardReadiness: jest.fn().mockResolvedValue({
18
+ decision: 'yes',
19
+ health: {},
20
+ reasons: [],
21
+ }),
22
+ WizardReadiness: {
23
+ Yes: 'yes',
24
+ No: 'no',
25
+ YesWithWarnings: 'yes-with-warnings',
26
+ },
27
+ SERVICE_LABELS: {},
28
+ }));
15
29
  function createStore(flow) {
16
30
  return new WizardStore(flow);
17
31
  }
@@ -151,16 +165,17 @@ describe('WizardStore', () => {
151
165
  store.setLoginUrl(null);
152
166
  expect(store.session.loginUrl).toBeNull();
153
167
  });
154
- it('setServiceStatus sets status info', () => {
168
+ it('setReadinessResult sets readiness info', () => {
155
169
  const store = createStore();
156
- const status = {
157
- description: 'Major outage',
158
- statusPageUrl: 'https://status.posthog.com',
170
+ const result = {
171
+ decision: WizardReadiness.No,
172
+ health: {},
173
+ reasons: ['Anthropic: down'],
159
174
  };
160
- store.setServiceStatus(status);
161
- expect(store.session.serviceStatus).toEqual(status);
162
- store.setServiceStatus(null);
163
- expect(store.session.serviceStatus).toBeNull();
175
+ store.setReadinessResult(result);
176
+ expect(store.session.readinessResult).toEqual(result);
177
+ store.setReadinessResult(null);
178
+ expect(store.session.readinessResult).toBeNull();
164
179
  });
165
180
  it('setMcpComplete marks MCP step done with outcome', () => {
166
181
  const store = createStore();
@@ -193,7 +208,7 @@ describe('WizardStore', () => {
193
208
  store.setDetectionComplete();
194
209
  store.setDetectedFramework('React');
195
210
  store.setLoginUrl('url');
196
- store.setServiceStatus(null);
211
+ store.setReadinessResult(null);
197
212
  store.setMcpComplete();
198
213
  store.setOutroData({ kind: OutroKind.Success });
199
214
  store.setFrameworkContext('k', 'v');
@@ -242,14 +257,29 @@ describe('WizardStore', () => {
242
257
  const store = createStore();
243
258
  expect(store.currentScreen).toBe(Screen.Intro);
244
259
  });
245
- it('advances to auth after region is set', () => {
260
+ it('advances to health check after setup confirmed', () => {
261
+ const store = createStore();
262
+ store.completeSetup();
263
+ expect(store.currentScreen).toBe(Screen.HealthCheck);
264
+ });
265
+ it('advances to auth after health check passes', () => {
246
266
  const store = createStore();
247
267
  store.completeSetup();
268
+ store.setReadinessResult({
269
+ decision: WizardReadiness.Yes,
270
+ health: {},
271
+ reasons: [],
272
+ });
248
273
  expect(store.currentScreen).toBe(Screen.Auth);
249
274
  });
250
275
  it('advances to run after credentials are set', () => {
251
276
  const store = createStore();
252
277
  store.completeSetup();
278
+ store.setReadinessResult({
279
+ decision: WizardReadiness.Yes,
280
+ health: {},
281
+ reasons: [],
282
+ });
253
283
  store.setCredentials({
254
284
  accessToken: 'tok',
255
285
  projectApiKey: 'pk',
@@ -261,6 +291,11 @@ describe('WizardStore', () => {
261
291
  it('advances to mcp after run completes', () => {
262
292
  const store = createStore();
263
293
  store.completeSetup();
294
+ store.setReadinessResult({
295
+ decision: WizardReadiness.Yes,
296
+ health: {},
297
+ reasons: [],
298
+ });
264
299
  store.setCredentials({
265
300
  accessToken: 'tok',
266
301
  projectApiKey: 'pk',
@@ -273,6 +308,11 @@ describe('WizardStore', () => {
273
308
  it('advances to outro after mcp completes', () => {
274
309
  const store = createStore();
275
310
  store.completeSetup();
311
+ store.setReadinessResult({
312
+ decision: WizardReadiness.Yes,
313
+ health: {},
314
+ reasons: [],
315
+ });
276
316
  store.setCredentials({
277
317
  accessToken: 'tok',
278
318
  projectApiKey: 'pk',
@@ -296,12 +336,12 @@ describe('WizardStore', () => {
296
336
  describe('overlay navigation', () => {
297
337
  it('pushOverlay shows the overlay over the current screen', () => {
298
338
  const store = createStore();
299
- store.pushOverlay(Overlay.Outage);
300
- expect(store.currentScreen).toBe(Overlay.Outage);
339
+ store.pushOverlay(Overlay.SettingsOverride);
340
+ expect(store.currentScreen).toBe(Overlay.SettingsOverride);
301
341
  });
302
342
  it('popOverlay returns to the underlying screen', () => {
303
343
  const store = createStore();
304
- store.pushOverlay(Overlay.Outage);
344
+ store.pushOverlay(Overlay.SettingsOverride);
305
345
  store.popOverlay();
306
346
  expect(store.currentScreen).toBe(Screen.Intro);
307
347
  });
@@ -309,13 +349,13 @@ describe('WizardStore', () => {
309
349
  const store = createStore();
310
350
  const cb = jest.fn();
311
351
  store.subscribe(cb);
312
- store.pushOverlay(Overlay.Outage);
352
+ store.pushOverlay(Overlay.SettingsOverride);
313
353
  expect(cb).toHaveBeenCalledTimes(1);
314
354
  expect(store.getVersion()).toBe(1);
315
355
  });
316
356
  it('popOverlay emits change and increments version', () => {
317
357
  const store = createStore();
318
- store.pushOverlay(Overlay.Outage);
358
+ store.pushOverlay(Overlay.SettingsOverride);
319
359
  const cb = jest.fn();
320
360
  store.subscribe(cb);
321
361
  store.popOverlay();
@@ -323,12 +363,12 @@ describe('WizardStore', () => {
323
363
  });
324
364
  it('pushOverlay sets direction to push', () => {
325
365
  const store = createStore();
326
- store.pushOverlay(Overlay.Outage);
366
+ store.pushOverlay(Overlay.SettingsOverride);
327
367
  expect(store.lastNavDirection).toBe('push');
328
368
  });
329
369
  it('popOverlay sets direction to pop', () => {
330
370
  const store = createStore();
331
- store.pushOverlay(Overlay.Outage);
371
+ store.pushOverlay(Overlay.SettingsOverride);
332
372
  store.popOverlay();
333
373
  expect(store.lastNavDirection).toBe('pop');
334
374
  });
@@ -524,21 +564,21 @@ describe('WizardStore', () => {
524
564
  store.subscribe(() => {
525
565
  screens.push(store.currentScreen);
526
566
  });
527
- store.completeSetup(); // -> auth
528
- store.pushOverlay(Overlay.Outage); // -> outage
567
+ store.completeSetup(); // -> health-check
568
+ store.pushOverlay(Overlay.SettingsOverride); // -> settings-override
529
569
  store.setCredentials({
530
- // -> outage (overlay still on top)
570
+ // -> settings-override (overlay still on top)
531
571
  accessToken: 'tok',
532
572
  projectApiKey: 'pk',
533
573
  host: 'h',
534
574
  projectId: 1,
535
575
  });
536
- store.popOverlay(); // -> run
576
+ store.popOverlay(); // -> health-check (readinessResult still null)
537
577
  expect(screens).toEqual([
538
- Screen.Auth,
539
- Overlay.Outage,
540
- Overlay.Outage,
541
- Screen.Run,
578
+ Screen.HealthCheck,
579
+ Overlay.SettingsOverride,
580
+ Overlay.SettingsOverride,
581
+ Screen.HealthCheck,
542
582
  ]);
543
583
  });
544
584
  it('unsubscribing mid-notification does not affect other subscribers', () => {
@@ -640,6 +680,11 @@ describe('WizardStore', () => {
640
680
  it('screen advances to outro on RunPhase.Error too', () => {
641
681
  const store = createStore();
642
682
  store.completeSetup();
683
+ store.setReadinessResult({
684
+ decision: WizardReadiness.Yes,
685
+ health: {},
686
+ reasons: [],
687
+ });
643
688
  store.setCredentials({
644
689
  accessToken: 'tok',
645
690
  projectApiKey: 'pk',
@@ -676,8 +721,15 @@ describe('WizardStore', () => {
676
721
  expect(store.currentScreen).toBe(Screen.Intro);
677
722
  // Step 1: Confirm setup
678
723
  store.completeSetup();
724
+ expect(store.currentScreen).toBe(Screen.HealthCheck);
725
+ // Step 2: Health check passes
726
+ store.setReadinessResult({
727
+ decision: WizardReadiness.Yes,
728
+ health: {},
729
+ reasons: [],
730
+ });
679
731
  expect(store.currentScreen).toBe(Screen.Auth);
680
- // Step 2: Authenticate
732
+ // Step 3: Authenticate
681
733
  store.setCredentials({
682
734
  accessToken: 'tok',
683
735
  projectApiKey: 'pk',
@@ -685,16 +737,16 @@ describe('WizardStore', () => {
685
737
  projectId: 1,
686
738
  });
687
739
  expect(store.currentScreen).toBe(Screen.Run);
688
- // Step 3: Start and complete run
740
+ // Step 4: Start and complete run
689
741
  store.setRunPhase(RunPhase.Running);
690
742
  expect(store.currentScreen).toBe(Screen.Run);
691
743
  store.setRunPhase(RunPhase.Completed);
692
744
  expect(store.currentScreen).toBe(Screen.Mcp);
693
- // Step 4: Complete MCP
745
+ // Step 5: Complete MCP
694
746
  store.setMcpComplete();
695
747
  expect(store.currentScreen).toBe(Screen.Outro);
696
748
  // Verify version was bumped for each setter call
697
- expect(store.getVersion()).toBe(5);
749
+ expect(store.getVersion()).toBe(6);
698
750
  });
699
751
  });
700
752
  // ── setupComplete promise ────────────────────────────────────────
@@ -1 +1 @@
1
- {"version":3,"file":"store.test.js","sourceRoot":"","sources":["../../../../../src/ui/tui/__tests__/store.test.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n WizardStore,\n TaskStatus,\n Flow,\n Screen,\n Overlay,\n RunPhase,\n McpOutcome,\n} from '../store.js';\nimport { OutroKind, AdditionalFeature } from '../../../lib/wizard-session.js';\nimport { buildSession } from '../../../lib/wizard-session.js';\nimport { Integration } from '../../../lib/constants.js';\nimport { analytics } from '../../../utils/analytics.js';\n\njest.mock('../../../utils/analytics.js', () => ({\n analytics: {\n capture: jest.fn(),\n wizardCapture: jest.fn(),\n setTag: jest.fn(),\n shutdown: jest.fn().mockResolvedValue(undefined),\n },\n sessionProperties: jest.fn(() => ({})),\n}));\n\nfunction createStore(flow?: Flow): WizardStore {\n return new WizardStore(flow);\n}\n\nconst wizardCaptureMock = analytics.wizardCapture as jest.Mock;\n\ndescribe('WizardStore', () => {\n beforeEach(() => {\n jest.clearAllMocks();\n });\n // ── Construction ─────────────────────────────────────────────────\n\n describe('constructor', () => {\n it('initialises with default state', () => {\n const store = createStore();\n expect(store.version).toBe('');\n expect(store.statusMessages).toEqual([]);\n expect(store.tasks).toEqual([]);\n expect(store.session).toEqual(buildSession({}));\n });\n\n it('defaults to Wizard flow', () => {\n const store = createStore();\n expect(store.router.activeFlow).toBe(Flow.Wizard);\n });\n\n it('accepts a custom flow', () => {\n const store = createStore(Flow.McpAdd);\n expect(store.router.activeFlow).toBe(Flow.McpAdd);\n });\n\n it('starts with version 0', () => {\n const store = createStore();\n expect(store.getVersion()).toBe(0);\n expect(store.getSnapshot()).toBe(0);\n });\n });\n\n // ── Change notification ──────────────────────────────────────────\n\n describe('change notification', () => {\n it('emitChange increments version and notifies subscribers', () => {\n const store = createStore();\n const listener = jest.fn();\n store.subscribe(listener);\n\n store.emitChange();\n\n expect(store.getVersion()).toBe(1);\n expect(listener).toHaveBeenCalledTimes(1);\n });\n\n it('version increments on each emitChange', () => {\n const store = createStore();\n store.emitChange();\n store.emitChange();\n store.emitChange();\n expect(store.getVersion()).toBe(3);\n });\n });\n\n // ── React integration (subscribe / getSnapshot) ──────────────────\n\n describe('subscribe / getSnapshot', () => {\n it('subscribe registers a listener that fires on change', () => {\n const store = createStore();\n const cb = jest.fn();\n store.subscribe(cb);\n\n store.emitChange();\n expect(cb).toHaveBeenCalledTimes(1);\n });\n\n it('subscribe returns an unsubscribe function', () => {\n const store = createStore();\n const cb = jest.fn();\n const unsub = store.subscribe(cb);\n\n unsub();\n store.emitChange();\n expect(cb).not.toHaveBeenCalled();\n });\n\n it('getSnapshot returns the current version', () => {\n const store = createStore();\n expect(store.getSnapshot()).toBe(0);\n store.emitChange();\n expect(store.getSnapshot()).toBe(1);\n });\n\n it('is compatible with useSyncExternalStore contract', () => {\n const store = createStore();\n const cb = jest.fn();\n const unsub = store.subscribe(cb);\n\n const v1 = store.getSnapshot();\n store.completeSetup();\n const v2 = store.getSnapshot();\n\n expect(v2).toBeGreaterThan(v1);\n expect(cb).toHaveBeenCalled();\n unsub();\n });\n });\n\n // ── Session setters ──────────────────────────────────────────────\n\n describe('session setters', () => {\n it('completeSetup sets setupConfirmed and resolves setupComplete promise', async () => {\n const store = createStore();\n const cb = jest.fn();\n store.subscribe(cb);\n\n store.completeSetup();\n\n expect(store.session.setupConfirmed).toBe(true);\n await store.setupComplete;\n expect(cb).toHaveBeenCalled();\n });\n\n it('setRunPhase updates session.runPhase', () => {\n const store = createStore();\n store.setRunPhase(RunPhase.Running);\n expect(store.session.runPhase).toBe(RunPhase.Running);\n });\n\n it('setCredentials updates session.credentials', () => {\n const store = createStore();\n const creds = {\n accessToken: 'tok',\n projectApiKey: 'pk',\n host: 'https://app.posthog.com',\n projectId: 42,\n };\n store.setCredentials(creds);\n expect(store.session.credentials).toEqual(creds);\n });\n\n it('setFrameworkConfig updates integration and frameworkConfig', () => {\n const store = createStore();\n const integration = Integration.nextjs;\n const config = {\n metadata: { name: 'Next.js' },\n } as WizardStore['session']['frameworkConfig'];\n\n store.setFrameworkConfig(integration, config);\n\n expect(store.session.integration).toBe(integration);\n expect(store.session.frameworkConfig).toBe(config);\n });\n\n it('setDetectionComplete marks detection done', () => {\n const store = createStore();\n expect(store.session.detectionComplete).toBe(false);\n store.setDetectionComplete();\n expect(store.session.detectionComplete).toBe(true);\n });\n\n it('setDetectedFramework sets the label', () => {\n const store = createStore();\n store.setDetectedFramework('Django');\n expect(store.session.detectedFrameworkLabel).toBe('Django');\n });\n\n it('setLoginUrl sets and clears the login URL', () => {\n const store = createStore();\n store.setLoginUrl('https://example.com/auth');\n expect(store.session.loginUrl).toBe('https://example.com/auth');\n\n store.setLoginUrl(null);\n expect(store.session.loginUrl).toBeNull();\n });\n\n it('setServiceStatus sets status info', () => {\n const store = createStore();\n const status = {\n description: 'Major outage',\n statusPageUrl: 'https://status.posthog.com',\n };\n store.setServiceStatus(status);\n expect(store.session.serviceStatus).toEqual(status);\n\n store.setServiceStatus(null);\n expect(store.session.serviceStatus).toBeNull();\n });\n\n it('setMcpComplete marks MCP step done with outcome', () => {\n const store = createStore();\n expect(store.session.mcpComplete).toBe(false);\n store.setMcpComplete(McpOutcome.Installed, ['Cursor']);\n expect(store.session.mcpComplete).toBe(true);\n expect(store.session.mcpOutcome).toBe(McpOutcome.Installed);\n expect(store.session.mcpInstalledClients).toEqual(['Cursor']);\n });\n\n it('setOutroData sets outro information', () => {\n const store = createStore();\n const data = { kind: OutroKind.Success, message: 'Done!' };\n store.setOutroData(data);\n expect(store.session.outroData).toEqual(data);\n });\n\n it('setFrameworkContext sets key-value pairs', () => {\n const store = createStore();\n store.setFrameworkContext('packageManager', 'pnpm');\n expect(store.session.frameworkContext['packageManager']).toBe('pnpm');\n\n store.setFrameworkContext('srcDir', 'src');\n expect(store.session.frameworkContext['srcDir']).toBe('src');\n });\n\n it('every setter emits exactly one change event', () => {\n const store = createStore();\n const cb = jest.fn();\n store.subscribe(cb);\n\n store.completeSetup();\n store.setRunPhase(RunPhase.Running);\n store.setCredentials(null);\n store.setDetectionComplete();\n store.setDetectedFramework('React');\n store.setLoginUrl('url');\n store.setServiceStatus(null);\n store.setMcpComplete();\n store.setOutroData({ kind: OutroKind.Success });\n store.setFrameworkContext('k', 'v');\n store.setFrameworkConfig(null, null);\n\n expect(cb).toHaveBeenCalledTimes(11);\n });\n });\n\n // ── Setter analytics events ────────────────────────────────────\n\n describe('setter analytics events', () => {\n it('completeSetup fires setup confirmed event', () => {\n const store = createStore();\n store.completeSetup();\n expect(wizardCaptureMock).toHaveBeenCalledWith(\n 'setup confirmed',\n expect.any(Object),\n );\n });\n\n it('setCredentials fires auth complete event', () => {\n const store = createStore();\n store.setCredentials({\n accessToken: 'tok',\n projectApiKey: 'pk',\n host: 'h',\n projectId: 42,\n });\n expect(wizardCaptureMock).toHaveBeenCalledWith('auth complete', {\n project_id: 42,\n });\n });\n\n it('enableFeature fires feature enabled event', () => {\n const store = createStore();\n store.enableFeature(AdditionalFeature.LLM);\n expect(wizardCaptureMock).toHaveBeenCalledWith('feature enabled', {\n feature: AdditionalFeature.LLM,\n });\n });\n\n it('setMcpComplete fires mcp complete event', () => {\n const store = createStore();\n store.setMcpComplete(McpOutcome.Installed, ['Cursor', 'VS Code']);\n expect(wizardCaptureMock).toHaveBeenCalledWith(\n 'mcp complete',\n expect.objectContaining({\n mcp_outcome: McpOutcome.Installed,\n mcp_installed_clients: ['Cursor', 'VS Code'],\n }),\n );\n });\n });\n\n // ── Screen resolution (derived state) ────────────────────────────\n\n describe('currentScreen', () => {\n it('starts at intro for Wizard flow', () => {\n const store = createStore();\n expect(store.currentScreen).toBe(Screen.Intro);\n });\n\n it('advances to auth after region is set', () => {\n const store = createStore();\n store.completeSetup();\n expect(store.currentScreen).toBe(Screen.Auth);\n });\n\n it('advances to run after credentials are set', () => {\n const store = createStore();\n store.completeSetup();\n store.setCredentials({\n accessToken: 'tok',\n projectApiKey: 'pk',\n host: 'h',\n projectId: 1,\n });\n expect(store.currentScreen).toBe(Screen.Run);\n });\n\n it('advances to mcp after run completes', () => {\n const store = createStore();\n store.completeSetup();\n store.setCredentials({\n accessToken: 'tok',\n projectApiKey: 'pk',\n host: 'h',\n projectId: 1,\n });\n store.setRunPhase(RunPhase.Completed);\n expect(store.currentScreen).toBe(Screen.Mcp);\n });\n\n it('advances to outro after mcp completes', () => {\n const store = createStore();\n store.completeSetup();\n store.setCredentials({\n accessToken: 'tok',\n projectApiKey: 'pk',\n host: 'h',\n projectId: 1,\n });\n store.setRunPhase(RunPhase.Completed);\n store.setMcpComplete();\n expect(store.currentScreen).toBe(Screen.Outro);\n });\n\n it('starts at McpAdd for McpAdd flow', () => {\n const store = createStore(Flow.McpAdd);\n expect(store.currentScreen).toBe(Screen.McpAdd);\n });\n\n it('starts at McpRemove for McpRemove flow', () => {\n const store = createStore(Flow.McpRemove);\n expect(store.currentScreen).toBe(Screen.McpRemove);\n });\n });\n\n // ── Overlay navigation ───────────────────────────────────────────\n\n describe('overlay navigation', () => {\n it('pushOverlay shows the overlay over the current screen', () => {\n const store = createStore();\n store.pushOverlay(Overlay.Outage);\n expect(store.currentScreen).toBe(Overlay.Outage);\n });\n\n it('popOverlay returns to the underlying screen', () => {\n const store = createStore();\n store.pushOverlay(Overlay.Outage);\n store.popOverlay();\n expect(store.currentScreen).toBe(Screen.Intro);\n });\n\n it('pushOverlay emits change and increments version', () => {\n const store = createStore();\n const cb = jest.fn();\n store.subscribe(cb);\n\n store.pushOverlay(Overlay.Outage);\n\n expect(cb).toHaveBeenCalledTimes(1);\n expect(store.getVersion()).toBe(1);\n });\n\n it('popOverlay emits change and increments version', () => {\n const store = createStore();\n store.pushOverlay(Overlay.Outage);\n\n const cb = jest.fn();\n store.subscribe(cb);\n store.popOverlay();\n\n expect(cb).toHaveBeenCalledTimes(1);\n });\n\n it('pushOverlay sets direction to push', () => {\n const store = createStore();\n store.pushOverlay(Overlay.Outage);\n expect(store.lastNavDirection).toBe('push');\n });\n\n it('popOverlay sets direction to pop', () => {\n const store = createStore();\n store.pushOverlay(Overlay.Outage);\n store.popOverlay();\n expect(store.lastNavDirection).toBe('pop');\n });\n });\n\n // ── Agent observation state ──────────────────────────────────────\n\n describe('statusMessages', () => {\n it('pushStatus appends messages', () => {\n const store = createStore();\n store.pushStatus('Installing SDK...');\n store.pushStatus('Configuring...');\n expect(store.statusMessages).toEqual([\n 'Installing SDK...',\n 'Configuring...',\n ]);\n });\n\n it('pushStatus emits change', () => {\n const store = createStore();\n const cb = jest.fn();\n store.subscribe(cb);\n\n store.pushStatus('msg');\n expect(cb).toHaveBeenCalledTimes(1);\n });\n });\n\n describe('tasks', () => {\n it('setTasks replaces the task list', () => {\n const store = createStore();\n const tasks = [\n { label: 'Install SDK', status: TaskStatus.Pending, done: false },\n { label: 'Configure', status: TaskStatus.Pending, done: false },\n ];\n store.setTasks(tasks);\n expect(store.tasks).toEqual(tasks);\n });\n\n it('updateTask marks a task as done', () => {\n const store = createStore();\n store.setTasks([\n { label: 'Install SDK', status: TaskStatus.Pending, done: false },\n ]);\n\n store.updateTask(0, true);\n\n expect(store.tasks[0].done).toBe(true);\n expect(store.tasks[0].status).toBe(TaskStatus.Completed);\n });\n\n it('updateTask marks a task as not done', () => {\n const store = createStore();\n store.setTasks([\n { label: 'Install SDK', status: TaskStatus.Completed, done: true },\n ]);\n\n store.updateTask(0, false);\n\n expect(store.tasks[0].done).toBe(false);\n expect(store.tasks[0].status).toBe(TaskStatus.Pending);\n });\n\n it('updateTask is a no-op for out-of-bounds index', () => {\n const store = createStore();\n store.setTasks([\n { label: 'Install SDK', status: TaskStatus.Pending, done: false },\n ]);\n\n const cb = jest.fn();\n store.subscribe(cb);\n store.updateTask(99, true);\n\n expect(cb).not.toHaveBeenCalled();\n });\n });\n\n describe('syncTodos', () => {\n it('maps incoming todos to TaskItems', () => {\n const store = createStore();\n store.syncTodos([\n { content: 'Install SDK', status: 'pending' },\n { content: 'Configure', status: 'completed' },\n ]);\n\n expect(store.tasks).toHaveLength(2);\n expect(store.tasks[0]).toEqual({\n label: 'Install SDK',\n activeForm: undefined,\n status: TaskStatus.Pending,\n done: false,\n });\n expect(store.tasks[1]).toEqual({\n label: 'Configure',\n activeForm: undefined,\n status: TaskStatus.Completed,\n done: true,\n });\n });\n\n it('retains completed tasks not in the incoming list', () => {\n const store = createStore();\n store.setTasks([\n { label: 'Old done task', status: TaskStatus.Completed, done: true },\n { label: 'Old pending task', status: TaskStatus.Pending, done: false },\n ]);\n\n store.syncTodos([{ content: 'New task', status: 'pending' }]);\n\n // Old done task is retained, old pending task is dropped\n expect(store.tasks).toHaveLength(2);\n expect(store.tasks[0].label).toBe('Old done task');\n expect(store.tasks[1].label).toBe('New task');\n });\n\n it('does not duplicate completed tasks that appear in both', () => {\n const store = createStore();\n store.setTasks([\n { label: 'Shared task', status: TaskStatus.Completed, done: true },\n ]);\n\n store.syncTodos([{ content: 'Shared task', status: 'completed' }]);\n\n // Should not have duplicates — incomingLabels includes \"Shared task\",\n // so the retained filter excludes it\n expect(store.tasks).toHaveLength(1);\n expect(store.tasks[0].label).toBe('Shared task');\n });\n\n it('preserves activeForm from incoming todos', () => {\n const store = createStore();\n store.syncTodos([\n {\n content: 'Installing',\n status: 'in_progress',\n activeForm: 'Installing SDK...',\n },\n ]);\n\n expect(store.tasks[0].activeForm).toBe('Installing SDK...');\n });\n\n it('emits change', () => {\n const store = createStore();\n const cb = jest.fn();\n store.subscribe(cb);\n store.syncTodos([{ content: 'task', status: 'pending' }]);\n expect(cb).toHaveBeenCalled();\n });\n });\n\n // ── Navigation direction ─────────────────────────────────────────\n\n describe('lastNavDirection', () => {\n it('starts as null', () => {\n const store = createStore();\n expect(store.lastNavDirection).toBeNull();\n });\n\n it('is set to push on emitChange', () => {\n const store = createStore();\n store.emitChange();\n expect(store.lastNavDirection).toBe('push');\n });\n });\n\n // ── Concurrent / rapid-fire mutations ─────────────────────────────\n\n describe('concurrent mutations', () => {\n it('rapid-fire setters each increment version by 1', () => {\n const store = createStore();\n const cb = jest.fn();\n store.subscribe(cb);\n\n store.completeSetup();\n store.setRunPhase(RunPhase.Running);\n store.pushStatus('msg1');\n store.pushStatus('msg2');\n store.setDetectedFramework('React');\n\n expect(store.getVersion()).toBe(5);\n expect(cb).toHaveBeenCalledTimes(5);\n });\n\n it('subscriber sees consistent state during a setter call', () => {\n const store = createStore();\n const snapshots: { confirmed: boolean; version: number }[] = [];\n\n store.subscribe(() => {\n snapshots.push({\n confirmed: store.session.setupConfirmed,\n version: store.getSnapshot(),\n });\n });\n\n store.completeSetup();\n\n expect(snapshots).toEqual([{ confirmed: true, version: 1 }]);\n });\n\n it('multiple subscribers all see the same state', () => {\n const store = createStore();\n const results: number[] = [];\n\n store.subscribe(() => results.push(store.getSnapshot()));\n store.subscribe(() => results.push(store.getSnapshot()));\n store.subscribe(() => results.push(store.getSnapshot()));\n\n store.completeSetup();\n\n // All 3 subscribers should see version 1\n expect(results).toEqual([1, 1, 1]);\n });\n\n it('subscriber that mutates store during notification triggers additional notifications', () => {\n const store = createStore();\n const versions: number[] = [];\n\n // First subscriber triggers another mutation\n store.subscribe(() => {\n versions.push(store.getSnapshot());\n if (\n store.session.setupConfirmed &&\n store.session.runPhase === RunPhase.Idle\n ) {\n store.setRunPhase(RunPhase.Running);\n }\n });\n\n store.completeSetup();\n\n // Should see version 1 (from completeSetup) and version 2 (from setRunPhase)\n expect(versions).toEqual([1, 2]);\n expect(store.session.runPhase).toBe(RunPhase.Running);\n });\n\n it('interleaved overlay and session mutations are all visible', () => {\n const store = createStore();\n const screens: string[] = [];\n\n store.subscribe(() => {\n screens.push(store.currentScreen);\n });\n\n store.completeSetup(); // -> auth\n store.pushOverlay(Overlay.Outage); // -> outage\n store.setCredentials({\n // -> outage (overlay still on top)\n accessToken: 'tok',\n projectApiKey: 'pk',\n host: 'h',\n projectId: 1,\n });\n store.popOverlay(); // -> run\n\n expect(screens).toEqual([\n Screen.Auth,\n Overlay.Outage,\n Overlay.Outage,\n Screen.Run,\n ]);\n });\n\n it('unsubscribing mid-notification does not affect other subscribers', () => {\n const store = createStore();\n const log: string[] = [];\n\n store.subscribe(() => {\n log.push('sub1');\n });\n\n const unsub2 = store.subscribe(() => {\n log.push('sub2');\n });\n\n store.subscribe(() => {\n log.push('sub3');\n });\n\n store.emitChange();\n expect(log).toEqual(['sub1', 'sub2', 'sub3']);\n\n // Unsub the second listener\n unsub2();\n log.length = 0;\n store.emitChange();\n expect(log).toEqual(['sub1', 'sub3']);\n });\n });\n\n // ── Multiple subscribers ─────────────────────────────────────────\n\n describe('multiple subscribers', () => {\n it('supports many concurrent subscribers', () => {\n const store = createStore();\n const callbacks = Array.from({ length: 50 }, () => jest.fn());\n const unsubs = callbacks.map((cb) => store.subscribe(cb));\n\n store.emitChange();\n\n callbacks.forEach((cb) => expect(cb).toHaveBeenCalledTimes(1));\n\n // Unsubscribe all\n unsubs.forEach((unsub) => unsub());\n store.emitChange();\n\n // No more notifications\n callbacks.forEach((cb) => expect(cb).toHaveBeenCalledTimes(1));\n });\n\n it('double-unsubscribe is safe', () => {\n const store = createStore();\n const cb = jest.fn();\n const unsub = store.subscribe(cb);\n\n unsub();\n unsub(); // should not throw\n\n store.emitChange();\n expect(cb).not.toHaveBeenCalled();\n });\n });\n\n // ── Edge cases ───────────────────────────────────────────────────\n\n describe('edge cases', () => {\n it('setFrameworkContext overwrites existing keys', () => {\n const store = createStore();\n store.setFrameworkContext('key', 'value1');\n store.setFrameworkContext('key', 'value2');\n expect(store.session.frameworkContext['key']).toBe('value2');\n });\n\n it('setFrameworkConfig with null integration and config', () => {\n const store = createStore();\n store.setFrameworkConfig(null, null);\n expect(store.session.integration).toBeNull();\n expect(store.session.frameworkConfig).toBeNull();\n });\n\n it('pushStatus with empty string', () => {\n const store = createStore();\n store.pushStatus('');\n expect(store.statusMessages).toEqual(['']);\n });\n\n it('syncTodos with empty array clears non-completed tasks', () => {\n const store = createStore();\n store.setTasks([\n { label: 'Pending', status: TaskStatus.Pending, done: false },\n { label: 'Done', status: TaskStatus.Completed, done: true },\n ]);\n\n store.syncTodos([]);\n\n // Only the completed task is retained\n expect(store.tasks).toEqual([\n { label: 'Done', status: TaskStatus.Completed, done: true },\n ]);\n });\n\n it('syncTodos with unknown status defaults to Pending', () => {\n const store = createStore();\n store.syncTodos([{ content: 'Task', status: '' }]);\n expect(store.tasks[0].status).toBe(TaskStatus.Pending);\n });\n\n it('updateTask with negative index is a no-op', () => {\n const store = createStore();\n store.setTasks([\n { label: 'Task', status: TaskStatus.Pending, done: false },\n ]);\n const cb = jest.fn();\n store.subscribe(cb);\n store.updateTask(-1, true);\n expect(cb).not.toHaveBeenCalled();\n });\n\n it('popOverlay on empty stack does not crash', () => {\n const store = createStore();\n expect(() => store.popOverlay()).not.toThrow();\n expect(store.currentScreen).toBe(Screen.Intro);\n });\n\n it('screen advances to outro on RunPhase.Error too', () => {\n const store = createStore();\n store.completeSetup();\n store.setCredentials({\n accessToken: 'tok',\n projectApiKey: 'pk',\n host: 'h',\n projectId: 1,\n });\n store.setRunPhase(RunPhase.Error);\n // Run is \"complete\" (either Completed or Error), so we advance past it\n expect(store.currentScreen).toBe(Screen.Mcp);\n });\n\n it('completeSetup can only resolve the promise once', async () => {\n const store = createStore();\n store.completeSetup();\n store.completeSetup(); // second call — promise already resolved\n\n await store.setupComplete;\n expect(store.session.setupConfirmed).toBe(true);\n });\n\n it('version property (string) is independent from internal _version counter', () => {\n const store = createStore();\n store.version = '1.2.3';\n expect(store.version).toBe('1.2.3');\n expect(store.getVersion()).toBe(0);\n\n store.emitChange();\n expect(store.version).toBe('1.2.3');\n expect(store.getVersion()).toBe(1);\n });\n });\n\n // ── Full wizard flow simulation ──────────────────────────────────\n\n describe('full wizard flow', () => {\n it('walks through the entire wizard flow correctly', () => {\n const store = createStore();\n const screenHistory: string[] = [];\n store.subscribe(() => screenHistory.push(store.currentScreen));\n\n expect(store.currentScreen).toBe(Screen.Intro);\n\n // Step 1: Confirm setup\n store.completeSetup();\n expect(store.currentScreen).toBe(Screen.Auth);\n\n // Step 2: Authenticate\n store.setCredentials({\n accessToken: 'tok',\n projectApiKey: 'pk',\n host: 'https://app.posthog.com',\n projectId: 1,\n });\n expect(store.currentScreen).toBe(Screen.Run);\n\n // Step 3: Start and complete run\n store.setRunPhase(RunPhase.Running);\n expect(store.currentScreen).toBe(Screen.Run);\n\n store.setRunPhase(RunPhase.Completed);\n expect(store.currentScreen).toBe(Screen.Mcp);\n\n // Step 4: Complete MCP\n store.setMcpComplete();\n expect(store.currentScreen).toBe(Screen.Outro);\n\n // Verify version was bumped for each setter call\n expect(store.getVersion()).toBe(5);\n });\n });\n\n // ── setupComplete promise ────────────────────────────────────────\n\n describe('setupComplete', () => {\n it('resolves when completeSetup is called', async () => {\n const store = createStore();\n store.completeSetup();\n await store.setupComplete;\n expect(store.session.setupConfirmed).toBe(true);\n });\n\n it('is a promise that can be awaited before completeSetup is called', async () => {\n const store = createStore();\n\n let resolved = false;\n void store.setupComplete.then(() => {\n resolved = true;\n });\n\n // Not yet resolved\n await Promise.resolve(); // flush microtasks\n expect(resolved).toBe(false);\n\n store.completeSetup();\n await store.setupComplete;\n expect(resolved).toBe(true);\n });\n });\n});\n"]}
1
+ {"version":3,"file":"store.test.js","sourceRoot":"","sources":["../../../../../src/ui/tui/__tests__/store.test.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,UAAU,EACV,IAAI,EACJ,MAAM,EACN,OAAO,EACP,QAAQ,EACR,UAAU,GACX,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAExD,IAAI,CAAC,IAAI,CAAC,6BAA6B,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9C,SAAS,EAAE;QACT,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE;QAClB,aAAa,EAAE,IAAI,CAAC,EAAE,EAAE;QACxB,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;QACjB,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;KACjD;IACD,iBAAiB,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;CACvC,CAAC,CAAC,CAAC;AAEJ,IAAI,CAAC,IAAI,CAAC,yCAAyC,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1D,uBAAuB,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;QACnD,QAAQ,EAAE,KAAK;QACf,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,EAAE;KACZ,CAAC;IACF,eAAe,EAAE;QACf,GAAG,EAAE,KAAK;QACV,EAAE,EAAE,IAAI;QACR,eAAe,EAAE,mBAAmB;KACrC;IACD,cAAc,EAAE,EAAE;CACnB,CAAC,CAAC,CAAC;AAEJ,SAAS,WAAW,CAAC,IAAW;IAC9B,OAAO,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,iBAAiB,GAAG,SAAS,CAAC,aAA0B,CAAC;AAE/D,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IACH,oEAAoE;IAEpE,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC/B,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACzC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAChC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;YACjC,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;YAC/B,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;YAC/B,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,oEAAoE;IAEpE,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;YAChE,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;YAC3B,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAE1B,KAAK,CAAC,UAAU,EAAE,CAAC;YAEnB,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,KAAK,CAAC,UAAU,EAAE,CAAC;YACnB,KAAK,CAAC,UAAU,EAAE,CAAC;YACnB,KAAK,CAAC,UAAU,EAAE,CAAC;YACnB,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,oEAAoE;IAEpE,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACvC,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;YAC7D,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;YACrB,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAEpB,KAAK,CAAC,UAAU,EAAE,CAAC;YACnB,MAAM,CAAC,EAAE,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;YACrB,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAElC,KAAK,EAAE,CAAC;YACR,KAAK,CAAC,UAAU,EAAE,CAAC;YACnB,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpC,KAAK,CAAC,UAAU,EAAE,CAAC;YACnB,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;YACrB,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAElC,MAAM,EAAE,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;YAC/B,KAAK,CAAC,aAAa,EAAE,CAAC;YACtB,MAAM,EAAE,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;YAE/B,MAAM,CAAC,EAAE,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;YAC/B,MAAM,CAAC,EAAE,CAAC,CAAC,gBAAgB,EAAE,CAAC;YAC9B,KAAK,EAAE,CAAC;QACV,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,oEAAoE;IAEpE,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;YACpF,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;YACrB,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAEpB,KAAK,CAAC,aAAa,EAAE,CAAC;YAEtB,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChD,MAAM,KAAK,CAAC,aAAa,CAAC;YAC1B,MAAM,CAAC,EAAE,CAAC,CAAC,gBAAgB,EAAE,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACpC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG;gBACZ,WAAW,EAAE,KAAK;gBAClB,aAAa,EAAE,IAAI;gBACnB,IAAI,EAAE,yBAAyB;gBAC/B,SAAS,EAAE,EAAE;aACd,CAAC;YACF,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YAC5B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;YACpE,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC;YACvC,MAAM,MAAM,GAAG;gBACb,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;aACe,CAAC;YAE/C,KAAK,CAAC,kBAAkB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YAE9C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACpD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpD,KAAK,CAAC,oBAAoB,EAAE,CAAC;YAC7B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,KAAK,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;YACrC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,KAAK,CAAC,WAAW,CAAC,0BAA0B,CAAC,CAAC;YAC9C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;YAEhE,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YACxB,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG;gBACb,QAAQ,EAAE,eAAe,CAAC,EAAE;gBAC5B,MAAM,EAAE,EAAW;gBACnB,OAAO,EAAE,CAAC,iBAAiB,CAAC;aAC7B,CAAC;YACF,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;YACjC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAEtD,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAC/B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,QAAQ,EAAE,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC9C,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;YACvD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YAC5D,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;YAC3D,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YACzB,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;YACpD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAEtE,KAAK,CAAC,mBAAmB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;YACrB,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAEpB,KAAK,CAAC,aAAa,EAAE,CAAC;YACtB,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACpC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YAC3B,KAAK,CAAC,oBAAoB,EAAE,CAAC;YAC7B,KAAK,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;YACpC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACzB,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAC/B,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,KAAK,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;YAChD,KAAK,CAAC,mBAAmB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACpC,KAAK,CAAC,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAErC,MAAM,CAAC,EAAE,CAAC,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,kEAAkE;IAElE,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACvC,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,KAAK,CAAC,aAAa,EAAE,CAAC;YACtB,MAAM,CAAC,iBAAiB,CAAC,CAAC,oBAAoB,CAC5C,iBAAiB,EACjB,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CACnB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,KAAK,CAAC,cAAc,CAAC;gBACnB,WAAW,EAAE,KAAK;gBAClB,aAAa,EAAE,IAAI;gBACnB,IAAI,EAAE,GAAG;gBACT,SAAS,EAAE,EAAE;aACd,CAAC,CAAC;YACH,MAAM,CAAC,iBAAiB,CAAC,CAAC,oBAAoB,CAAC,eAAe,EAAE;gBAC9D,UAAU,EAAE,EAAE;aACf,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,KAAK,CAAC,aAAa,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;YAC3C,MAAM,CAAC,iBAAiB,CAAC,CAAC,oBAAoB,CAAC,iBAAiB,EAAE;gBAChE,OAAO,EAAE,iBAAiB,CAAC,GAAG;aAC/B,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;YAClE,MAAM,CAAC,iBAAiB,CAAC,CAAC,oBAAoB,CAC5C,cAAc,EACd,MAAM,CAAC,gBAAgB,CAAC;gBACtB,WAAW,EAAE,UAAU,CAAC,SAAS;gBACjC,qBAAqB,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC;aAC7C,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,oEAAoE;IAEpE,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,KAAK,CAAC,aAAa,EAAE,CAAC;YACtB,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,KAAK,CAAC,aAAa,EAAE,CAAC;YACtB,KAAK,CAAC,kBAAkB,CAAC;gBACvB,QAAQ,EAAE,eAAe,CAAC,GAAG;gBAC7B,MAAM,EAAE,EAAW;gBACnB,OAAO,EAAE,EAAE;aACZ,CAAC,CAAC;YACH,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,KAAK,CAAC,aAAa,EAAE,CAAC;YACtB,KAAK,CAAC,kBAAkB,CAAC;gBACvB,QAAQ,EAAE,eAAe,CAAC,GAAG;gBAC7B,MAAM,EAAE,EAAW;gBACnB,OAAO,EAAE,EAAE;aACZ,CAAC,CAAC;YACH,KAAK,CAAC,cAAc,CAAC;gBACnB,WAAW,EAAE,KAAK;gBAClB,aAAa,EAAE,IAAI;gBACnB,IAAI,EAAE,GAAG;gBACT,SAAS,EAAE,CAAC;aACb,CAAC,CAAC;YACH,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,KAAK,CAAC,aAAa,EAAE,CAAC;YACtB,KAAK,CAAC,kBAAkB,CAAC;gBACvB,QAAQ,EAAE,eAAe,CAAC,GAAG;gBAC7B,MAAM,EAAE,EAAW;gBACnB,OAAO,EAAE,EAAE;aACZ,CAAC,CAAC;YACH,KAAK,CAAC,cAAc,CAAC;gBACnB,WAAW,EAAE,KAAK;gBAClB,aAAa,EAAE,IAAI;gBACnB,IAAI,EAAE,GAAG;gBACT,SAAS,EAAE,CAAC;aACb,CAAC,CAAC;YACH,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YACtC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,KAAK,CAAC,aAAa,EAAE,CAAC;YACtB,KAAK,CAAC,kBAAkB,CAAC;gBACvB,QAAQ,EAAE,eAAe,CAAC,GAAG;gBAC7B,MAAM,EAAE,EAAW;gBACnB,OAAO,EAAE,EAAE;aACZ,CAAC,CAAC;YACH,KAAK,CAAC,cAAc,CAAC;gBACnB,WAAW,EAAE,KAAK;gBAClB,aAAa,EAAE,IAAI;gBACnB,IAAI,EAAE,GAAG;gBACT,SAAS,EAAE,CAAC;aACb,CAAC,CAAC;YACH,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YACtC,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC1C,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,oEAAoE;IAEpE,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAC5C,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAC5C,KAAK,CAAC,UAAU,EAAE,CAAC;YACnB,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;YACrB,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAEpB,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAE5C,MAAM,CAAC,EAAE,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAE5C,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;YACrB,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACpB,KAAK,CAAC,UAAU,EAAE,CAAC;YAEnB,MAAM,CAAC,EAAE,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAC5C,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAC5C,KAAK,CAAC,UAAU,EAAE,CAAC;YACnB,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,oEAAoE;IAEpE,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;YACrC,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,KAAK,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC;YACtC,KAAK,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;YACnC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC;gBACnC,mBAAmB;gBACnB,gBAAgB;aACjB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;YACjC,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;YACrB,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAEpB,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACxB,MAAM,CAAC,EAAE,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;QACrB,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG;gBACZ,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE;gBACjE,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE;aAChE,CAAC;YACF,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACtB,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,KAAK,CAAC,QAAQ,CAAC;gBACb,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE;aAClE,CAAC,CAAC;YAEH,KAAK,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YAE1B,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,KAAK,CAAC,QAAQ,CAAC;gBACb,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE;aACnE,CAAC,CAAC;YAEH,KAAK,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YAE3B,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACxC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,KAAK,CAAC,QAAQ,CAAC;gBACb,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE;aAClE,CAAC,CAAC;YAEH,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;YACrB,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACpB,KAAK,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAE3B,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;QACzB,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,KAAK,CAAC,SAAS,CAAC;gBACd,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE;gBAC7C,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE;aAC9C,CAAC,CAAC;YAEH,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;gBAC7B,KAAK,EAAE,aAAa;gBACpB,UAAU,EAAE,SAAS;gBACrB,MAAM,EAAE,UAAU,CAAC,OAAO;gBAC1B,IAAI,EAAE,KAAK;aACZ,CAAC,CAAC;YACH,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;gBAC7B,KAAK,EAAE,WAAW;gBAClB,UAAU,EAAE,SAAS;gBACrB,MAAM,EAAE,UAAU,CAAC,SAAS;gBAC5B,IAAI,EAAE,IAAI;aACX,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,KAAK,CAAC,QAAQ,CAAC;gBACb,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,UAAU,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE;gBACpE,EAAE,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE;aACvE,CAAC,CAAC;YAEH,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;YAE9D,yDAAyD;YACzD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACnD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;YAChE,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,KAAK,CAAC,QAAQ,CAAC;gBACb,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE;aACnE,CAAC,CAAC;YAEH,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;YAEnE,sEAAsE;YACtE,qCAAqC;YACrC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,KAAK,CAAC,SAAS,CAAC;gBACd;oBACE,OAAO,EAAE,YAAY;oBACrB,MAAM,EAAE,aAAa;oBACrB,UAAU,EAAE,mBAAmB;iBAChC;aACF,CAAC,CAAC;YAEH,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;YACtB,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;YACrB,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACpB,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;YAC1D,MAAM,CAAC,EAAE,CAAC,CAAC,gBAAgB,EAAE,CAAC;QAChC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,oEAAoE;IAEpE,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,gBAAgB,EAAE,GAAG,EAAE;YACxB,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,KAAK,CAAC,UAAU,EAAE,CAAC;YACnB,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,qEAAqE;IAErE,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;YACrB,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAEpB,KAAK,CAAC,aAAa,EAAE,CAAC;YACtB,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACpC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACzB,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACzB,KAAK,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;YAEpC,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,CAAC,EAAE,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,MAAM,SAAS,GAA8C,EAAE,CAAC;YAEhE,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;gBACnB,SAAS,CAAC,IAAI,CAAC;oBACb,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,cAAc;oBACvC,OAAO,EAAE,KAAK,CAAC,WAAW,EAAE;iBAC7B,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,aAAa,EAAE,CAAC;YAEtB,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAa,EAAE,CAAC;YAE7B,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;YACzD,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;YACzD,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;YAEzD,KAAK,CAAC,aAAa,EAAE,CAAC;YAEtB,yCAAyC;YACzC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qFAAqF,EAAE,GAAG,EAAE;YAC7F,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAa,EAAE,CAAC;YAE9B,6CAA6C;YAC7C,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;gBACnB,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;gBACnC,IACE,KAAK,CAAC,OAAO,CAAC,cAAc;oBAC5B,KAAK,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,IAAI,EACxC,CAAC;oBACD,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBACtC,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,aAAa,EAAE,CAAC;YAEtB,6EAA6E;YAC7E,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACjC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;YACnE,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAa,EAAE,CAAC;YAE7B,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;gBACnB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YACpC,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC,kBAAkB;YACzC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,uBAAuB;YACpE,KAAK,CAAC,cAAc,CAAC;gBACnB,8CAA8C;gBAC9C,WAAW,EAAE,KAAK;gBAClB,aAAa,EAAE,IAAI;gBACnB,IAAI,EAAE,GAAG;gBACT,SAAS,EAAE,CAAC;aACb,CAAC,CAAC;YACH,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,+CAA+C;YAEnE,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;gBACtB,MAAM,CAAC,WAAW;gBAClB,OAAO,CAAC,gBAAgB;gBACxB,OAAO,CAAC,gBAAgB;gBACxB,MAAM,CAAC,WAAW;aACnB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;YAC1E,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAa,EAAE,CAAC;YAEzB,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;gBACnB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACnB,CAAC,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;gBAClC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACnB,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;gBACnB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACnB,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,UAAU,EAAE,CAAC;YACnB,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;YAE9C,4BAA4B;YAC5B,MAAM,EAAE,CAAC;YACT,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;YACf,KAAK,CAAC,UAAU,EAAE,CAAC;YACnB,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,oEAAoE;IAEpE,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9D,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;YAE1D,KAAK,CAAC,UAAU,EAAE,CAAC;YAEnB,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;YAE/D,kBAAkB;YAClB,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;YACnC,KAAK,CAAC,UAAU,EAAE,CAAC;YAEnB,wBAAwB;YACxB,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;YACrB,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAElC,KAAK,EAAE,CAAC;YACR,KAAK,EAAE,CAAC,CAAC,mBAAmB;YAE5B,KAAK,CAAC,UAAU,EAAE,CAAC;YACnB,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,oEAAoE;IAEpE,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,KAAK,CAAC,mBAAmB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC3C,KAAK,CAAC,mBAAmB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;YAC7D,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,KAAK,CAAC,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACrC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC7C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,QAAQ,EAAE,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YACrB,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,KAAK,CAAC,QAAQ,CAAC;gBACb,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE;gBAC7D,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE;aAC5D,CAAC,CAAC;YAEH,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAEpB,sCAAsC;YACtC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;gBAC1B,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE;aAC5D,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YACnD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,KAAK,CAAC,QAAQ,CAAC;gBACb,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE;aAC3D,CAAC,CAAC;YACH,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;YACrB,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACpB,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YAC3B,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YAC/C,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,KAAK,CAAC,aAAa,EAAE,CAAC;YACtB,KAAK,CAAC,kBAAkB,CAAC;gBACvB,QAAQ,EAAE,eAAe,CAAC,GAAG;gBAC7B,MAAM,EAAE,EAAW;gBACnB,OAAO,EAAE,EAAE;aACZ,CAAC,CAAC;YACH,KAAK,CAAC,cAAc,CAAC;gBACnB,WAAW,EAAE,KAAK;gBAClB,aAAa,EAAE,IAAI;gBACnB,IAAI,EAAE,GAAG;gBACT,SAAS,EAAE,CAAC;aACb,CAAC,CAAC;YACH,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAClC,uEAAuE;YACvE,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,KAAK,CAAC,aAAa,EAAE,CAAC;YACtB,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC,yCAAyC;YAEhE,MAAM,KAAK,CAAC,aAAa,CAAC;YAC1B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;YACjF,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;YACxB,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACpC,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAEnC,KAAK,CAAC,UAAU,EAAE,CAAC;YACnB,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACpC,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,oEAAoE;IAEpE,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,MAAM,aAAa,GAAa,EAAE,CAAC;YACnC,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;YAE/D,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAE/C,wBAAwB;YACxB,KAAK,CAAC,aAAa,EAAE,CAAC;YACtB,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAErD,8BAA8B;YAC9B,KAAK,CAAC,kBAAkB,CAAC;gBACvB,QAAQ,EAAE,eAAe,CAAC,GAAG;gBAC7B,MAAM,EAAE,EAAW;gBACnB,OAAO,EAAE,EAAE;aACZ,CAAC,CAAC;YACH,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAE9C,uBAAuB;YACvB,KAAK,CAAC,cAAc,CAAC;gBACnB,WAAW,EAAE,KAAK;gBAClB,aAAa,EAAE,IAAI;gBACnB,IAAI,EAAE,yBAAyB;gBAC/B,SAAS,EAAE,CAAC;aACb,CAAC,CAAC;YACH,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAE7C,iCAAiC;YACjC,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACpC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAE7C,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YACtC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAE7C,uBAAuB;YACvB,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAE/C,iDAAiD;YACjD,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,oEAAoE;IAEpE,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACrD,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,KAAK,CAAC,aAAa,EAAE,CAAC;YACtB,MAAM,KAAK,CAAC,aAAa,CAAC;YAC1B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;YAC/E,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAE5B,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,KAAK,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE;gBACjC,QAAQ,GAAG,IAAI,CAAC;YAClB,CAAC,CAAC,CAAC;YAEH,mBAAmB;YACnB,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,mBAAmB;YAC5C,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAE7B,KAAK,CAAC,aAAa,EAAE,CAAC;YACtB,MAAM,KAAK,CAAC,aAAa,CAAC;YAC1B,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import {\n WizardStore,\n TaskStatus,\n Flow,\n Screen,\n Overlay,\n RunPhase,\n McpOutcome,\n} from '../store.js';\nimport { OutroKind, AdditionalFeature } from '../../../lib/wizard-session.js';\nimport { WizardReadiness } from '../../../lib/health-checks/readiness.js';\nimport { buildSession } from '../../../lib/wizard-session.js';\nimport { Integration } from '../../../lib/constants.js';\nimport { analytics } from '../../../utils/analytics.js';\n\njest.mock('../../../utils/analytics.js', () => ({\n analytics: {\n capture: jest.fn(),\n wizardCapture: jest.fn(),\n setTag: jest.fn(),\n shutdown: jest.fn().mockResolvedValue(undefined),\n },\n sessionProperties: jest.fn(() => ({})),\n}));\n\njest.mock('../../../lib/health-checks/readiness.js', () => ({\n evaluateWizardReadiness: jest.fn().mockResolvedValue({\n decision: 'yes',\n health: {},\n reasons: [],\n }),\n WizardReadiness: {\n Yes: 'yes',\n No: 'no',\n YesWithWarnings: 'yes-with-warnings',\n },\n SERVICE_LABELS: {},\n}));\n\nfunction createStore(flow?: Flow): WizardStore {\n return new WizardStore(flow);\n}\n\nconst wizardCaptureMock = analytics.wizardCapture as jest.Mock;\n\ndescribe('WizardStore', () => {\n beforeEach(() => {\n jest.clearAllMocks();\n });\n // ── Construction ─────────────────────────────────────────────────\n\n describe('constructor', () => {\n it('initialises with default state', () => {\n const store = createStore();\n expect(store.version).toBe('');\n expect(store.statusMessages).toEqual([]);\n expect(store.tasks).toEqual([]);\n expect(store.session).toEqual(buildSession({}));\n });\n\n it('defaults to Wizard flow', () => {\n const store = createStore();\n expect(store.router.activeFlow).toBe(Flow.Wizard);\n });\n\n it('accepts a custom flow', () => {\n const store = createStore(Flow.McpAdd);\n expect(store.router.activeFlow).toBe(Flow.McpAdd);\n });\n\n it('starts with version 0', () => {\n const store = createStore();\n expect(store.getVersion()).toBe(0);\n expect(store.getSnapshot()).toBe(0);\n });\n });\n\n // ── Change notification ──────────────────────────────────────────\n\n describe('change notification', () => {\n it('emitChange increments version and notifies subscribers', () => {\n const store = createStore();\n const listener = jest.fn();\n store.subscribe(listener);\n\n store.emitChange();\n\n expect(store.getVersion()).toBe(1);\n expect(listener).toHaveBeenCalledTimes(1);\n });\n\n it('version increments on each emitChange', () => {\n const store = createStore();\n store.emitChange();\n store.emitChange();\n store.emitChange();\n expect(store.getVersion()).toBe(3);\n });\n });\n\n // ── React integration (subscribe / getSnapshot) ──────────────────\n\n describe('subscribe / getSnapshot', () => {\n it('subscribe registers a listener that fires on change', () => {\n const store = createStore();\n const cb = jest.fn();\n store.subscribe(cb);\n\n store.emitChange();\n expect(cb).toHaveBeenCalledTimes(1);\n });\n\n it('subscribe returns an unsubscribe function', () => {\n const store = createStore();\n const cb = jest.fn();\n const unsub = store.subscribe(cb);\n\n unsub();\n store.emitChange();\n expect(cb).not.toHaveBeenCalled();\n });\n\n it('getSnapshot returns the current version', () => {\n const store = createStore();\n expect(store.getSnapshot()).toBe(0);\n store.emitChange();\n expect(store.getSnapshot()).toBe(1);\n });\n\n it('is compatible with useSyncExternalStore contract', () => {\n const store = createStore();\n const cb = jest.fn();\n const unsub = store.subscribe(cb);\n\n const v1 = store.getSnapshot();\n store.completeSetup();\n const v2 = store.getSnapshot();\n\n expect(v2).toBeGreaterThan(v1);\n expect(cb).toHaveBeenCalled();\n unsub();\n });\n });\n\n // ── Session setters ──────────────────────────────────────────────\n\n describe('session setters', () => {\n it('completeSetup sets setupConfirmed and resolves setupComplete promise', async () => {\n const store = createStore();\n const cb = jest.fn();\n store.subscribe(cb);\n\n store.completeSetup();\n\n expect(store.session.setupConfirmed).toBe(true);\n await store.setupComplete;\n expect(cb).toHaveBeenCalled();\n });\n\n it('setRunPhase updates session.runPhase', () => {\n const store = createStore();\n store.setRunPhase(RunPhase.Running);\n expect(store.session.runPhase).toBe(RunPhase.Running);\n });\n\n it('setCredentials updates session.credentials', () => {\n const store = createStore();\n const creds = {\n accessToken: 'tok',\n projectApiKey: 'pk',\n host: 'https://app.posthog.com',\n projectId: 42,\n };\n store.setCredentials(creds);\n expect(store.session.credentials).toEqual(creds);\n });\n\n it('setFrameworkConfig updates integration and frameworkConfig', () => {\n const store = createStore();\n const integration = Integration.nextjs;\n const config = {\n metadata: { name: 'Next.js' },\n } as WizardStore['session']['frameworkConfig'];\n\n store.setFrameworkConfig(integration, config);\n\n expect(store.session.integration).toBe(integration);\n expect(store.session.frameworkConfig).toBe(config);\n });\n\n it('setDetectionComplete marks detection done', () => {\n const store = createStore();\n expect(store.session.detectionComplete).toBe(false);\n store.setDetectionComplete();\n expect(store.session.detectionComplete).toBe(true);\n });\n\n it('setDetectedFramework sets the label', () => {\n const store = createStore();\n store.setDetectedFramework('Django');\n expect(store.session.detectedFrameworkLabel).toBe('Django');\n });\n\n it('setLoginUrl sets and clears the login URL', () => {\n const store = createStore();\n store.setLoginUrl('https://example.com/auth');\n expect(store.session.loginUrl).toBe('https://example.com/auth');\n\n store.setLoginUrl(null);\n expect(store.session.loginUrl).toBeNull();\n });\n\n it('setReadinessResult sets readiness info', () => {\n const store = createStore();\n const result = {\n decision: WizardReadiness.No,\n health: {} as never,\n reasons: ['Anthropic: down'],\n };\n store.setReadinessResult(result);\n expect(store.session.readinessResult).toEqual(result);\n\n store.setReadinessResult(null);\n expect(store.session.readinessResult).toBeNull();\n });\n\n it('setMcpComplete marks MCP step done with outcome', () => {\n const store = createStore();\n expect(store.session.mcpComplete).toBe(false);\n store.setMcpComplete(McpOutcome.Installed, ['Cursor']);\n expect(store.session.mcpComplete).toBe(true);\n expect(store.session.mcpOutcome).toBe(McpOutcome.Installed);\n expect(store.session.mcpInstalledClients).toEqual(['Cursor']);\n });\n\n it('setOutroData sets outro information', () => {\n const store = createStore();\n const data = { kind: OutroKind.Success, message: 'Done!' };\n store.setOutroData(data);\n expect(store.session.outroData).toEqual(data);\n });\n\n it('setFrameworkContext sets key-value pairs', () => {\n const store = createStore();\n store.setFrameworkContext('packageManager', 'pnpm');\n expect(store.session.frameworkContext['packageManager']).toBe('pnpm');\n\n store.setFrameworkContext('srcDir', 'src');\n expect(store.session.frameworkContext['srcDir']).toBe('src');\n });\n\n it('every setter emits exactly one change event', () => {\n const store = createStore();\n const cb = jest.fn();\n store.subscribe(cb);\n\n store.completeSetup();\n store.setRunPhase(RunPhase.Running);\n store.setCredentials(null);\n store.setDetectionComplete();\n store.setDetectedFramework('React');\n store.setLoginUrl('url');\n store.setReadinessResult(null);\n store.setMcpComplete();\n store.setOutroData({ kind: OutroKind.Success });\n store.setFrameworkContext('k', 'v');\n store.setFrameworkConfig(null, null);\n\n expect(cb).toHaveBeenCalledTimes(11);\n });\n });\n\n // ── Setter analytics events ────────────────────────────────────\n\n describe('setter analytics events', () => {\n it('completeSetup fires setup confirmed event', () => {\n const store = createStore();\n store.completeSetup();\n expect(wizardCaptureMock).toHaveBeenCalledWith(\n 'setup confirmed',\n expect.any(Object),\n );\n });\n\n it('setCredentials fires auth complete event', () => {\n const store = createStore();\n store.setCredentials({\n accessToken: 'tok',\n projectApiKey: 'pk',\n host: 'h',\n projectId: 42,\n });\n expect(wizardCaptureMock).toHaveBeenCalledWith('auth complete', {\n project_id: 42,\n });\n });\n\n it('enableFeature fires feature enabled event', () => {\n const store = createStore();\n store.enableFeature(AdditionalFeature.LLM);\n expect(wizardCaptureMock).toHaveBeenCalledWith('feature enabled', {\n feature: AdditionalFeature.LLM,\n });\n });\n\n it('setMcpComplete fires mcp complete event', () => {\n const store = createStore();\n store.setMcpComplete(McpOutcome.Installed, ['Cursor', 'VS Code']);\n expect(wizardCaptureMock).toHaveBeenCalledWith(\n 'mcp complete',\n expect.objectContaining({\n mcp_outcome: McpOutcome.Installed,\n mcp_installed_clients: ['Cursor', 'VS Code'],\n }),\n );\n });\n });\n\n // ── Screen resolution (derived state) ────────────────────────────\n\n describe('currentScreen', () => {\n it('starts at intro for Wizard flow', () => {\n const store = createStore();\n expect(store.currentScreen).toBe(Screen.Intro);\n });\n\n it('advances to health check after setup confirmed', () => {\n const store = createStore();\n store.completeSetup();\n expect(store.currentScreen).toBe(Screen.HealthCheck);\n });\n\n it('advances to auth after health check passes', () => {\n const store = createStore();\n store.completeSetup();\n store.setReadinessResult({\n decision: WizardReadiness.Yes,\n health: {} as never,\n reasons: [],\n });\n expect(store.currentScreen).toBe(Screen.Auth);\n });\n\n it('advances to run after credentials are set', () => {\n const store = createStore();\n store.completeSetup();\n store.setReadinessResult({\n decision: WizardReadiness.Yes,\n health: {} as never,\n reasons: [],\n });\n store.setCredentials({\n accessToken: 'tok',\n projectApiKey: 'pk',\n host: 'h',\n projectId: 1,\n });\n expect(store.currentScreen).toBe(Screen.Run);\n });\n\n it('advances to mcp after run completes', () => {\n const store = createStore();\n store.completeSetup();\n store.setReadinessResult({\n decision: WizardReadiness.Yes,\n health: {} as never,\n reasons: [],\n });\n store.setCredentials({\n accessToken: 'tok',\n projectApiKey: 'pk',\n host: 'h',\n projectId: 1,\n });\n store.setRunPhase(RunPhase.Completed);\n expect(store.currentScreen).toBe(Screen.Mcp);\n });\n\n it('advances to outro after mcp completes', () => {\n const store = createStore();\n store.completeSetup();\n store.setReadinessResult({\n decision: WizardReadiness.Yes,\n health: {} as never,\n reasons: [],\n });\n store.setCredentials({\n accessToken: 'tok',\n projectApiKey: 'pk',\n host: 'h',\n projectId: 1,\n });\n store.setRunPhase(RunPhase.Completed);\n store.setMcpComplete();\n expect(store.currentScreen).toBe(Screen.Outro);\n });\n\n it('starts at McpAdd for McpAdd flow', () => {\n const store = createStore(Flow.McpAdd);\n expect(store.currentScreen).toBe(Screen.McpAdd);\n });\n\n it('starts at McpRemove for McpRemove flow', () => {\n const store = createStore(Flow.McpRemove);\n expect(store.currentScreen).toBe(Screen.McpRemove);\n });\n });\n\n // ── Overlay navigation ───────────────────────────────────────────\n\n describe('overlay navigation', () => {\n it('pushOverlay shows the overlay over the current screen', () => {\n const store = createStore();\n store.pushOverlay(Overlay.SettingsOverride);\n expect(store.currentScreen).toBe(Overlay.SettingsOverride);\n });\n\n it('popOverlay returns to the underlying screen', () => {\n const store = createStore();\n store.pushOverlay(Overlay.SettingsOverride);\n store.popOverlay();\n expect(store.currentScreen).toBe(Screen.Intro);\n });\n\n it('pushOverlay emits change and increments version', () => {\n const store = createStore();\n const cb = jest.fn();\n store.subscribe(cb);\n\n store.pushOverlay(Overlay.SettingsOverride);\n\n expect(cb).toHaveBeenCalledTimes(1);\n expect(store.getVersion()).toBe(1);\n });\n\n it('popOverlay emits change and increments version', () => {\n const store = createStore();\n store.pushOverlay(Overlay.SettingsOverride);\n\n const cb = jest.fn();\n store.subscribe(cb);\n store.popOverlay();\n\n expect(cb).toHaveBeenCalledTimes(1);\n });\n\n it('pushOverlay sets direction to push', () => {\n const store = createStore();\n store.pushOverlay(Overlay.SettingsOverride);\n expect(store.lastNavDirection).toBe('push');\n });\n\n it('popOverlay sets direction to pop', () => {\n const store = createStore();\n store.pushOverlay(Overlay.SettingsOverride);\n store.popOverlay();\n expect(store.lastNavDirection).toBe('pop');\n });\n });\n\n // ── Agent observation state ──────────────────────────────────────\n\n describe('statusMessages', () => {\n it('pushStatus appends messages', () => {\n const store = createStore();\n store.pushStatus('Installing SDK...');\n store.pushStatus('Configuring...');\n expect(store.statusMessages).toEqual([\n 'Installing SDK...',\n 'Configuring...',\n ]);\n });\n\n it('pushStatus emits change', () => {\n const store = createStore();\n const cb = jest.fn();\n store.subscribe(cb);\n\n store.pushStatus('msg');\n expect(cb).toHaveBeenCalledTimes(1);\n });\n });\n\n describe('tasks', () => {\n it('setTasks replaces the task list', () => {\n const store = createStore();\n const tasks = [\n { label: 'Install SDK', status: TaskStatus.Pending, done: false },\n { label: 'Configure', status: TaskStatus.Pending, done: false },\n ];\n store.setTasks(tasks);\n expect(store.tasks).toEqual(tasks);\n });\n\n it('updateTask marks a task as done', () => {\n const store = createStore();\n store.setTasks([\n { label: 'Install SDK', status: TaskStatus.Pending, done: false },\n ]);\n\n store.updateTask(0, true);\n\n expect(store.tasks[0].done).toBe(true);\n expect(store.tasks[0].status).toBe(TaskStatus.Completed);\n });\n\n it('updateTask marks a task as not done', () => {\n const store = createStore();\n store.setTasks([\n { label: 'Install SDK', status: TaskStatus.Completed, done: true },\n ]);\n\n store.updateTask(0, false);\n\n expect(store.tasks[0].done).toBe(false);\n expect(store.tasks[0].status).toBe(TaskStatus.Pending);\n });\n\n it('updateTask is a no-op for out-of-bounds index', () => {\n const store = createStore();\n store.setTasks([\n { label: 'Install SDK', status: TaskStatus.Pending, done: false },\n ]);\n\n const cb = jest.fn();\n store.subscribe(cb);\n store.updateTask(99, true);\n\n expect(cb).not.toHaveBeenCalled();\n });\n });\n\n describe('syncTodos', () => {\n it('maps incoming todos to TaskItems', () => {\n const store = createStore();\n store.syncTodos([\n { content: 'Install SDK', status: 'pending' },\n { content: 'Configure', status: 'completed' },\n ]);\n\n expect(store.tasks).toHaveLength(2);\n expect(store.tasks[0]).toEqual({\n label: 'Install SDK',\n activeForm: undefined,\n status: TaskStatus.Pending,\n done: false,\n });\n expect(store.tasks[1]).toEqual({\n label: 'Configure',\n activeForm: undefined,\n status: TaskStatus.Completed,\n done: true,\n });\n });\n\n it('retains completed tasks not in the incoming list', () => {\n const store = createStore();\n store.setTasks([\n { label: 'Old done task', status: TaskStatus.Completed, done: true },\n { label: 'Old pending task', status: TaskStatus.Pending, done: false },\n ]);\n\n store.syncTodos([{ content: 'New task', status: 'pending' }]);\n\n // Old done task is retained, old pending task is dropped\n expect(store.tasks).toHaveLength(2);\n expect(store.tasks[0].label).toBe('Old done task');\n expect(store.tasks[1].label).toBe('New task');\n });\n\n it('does not duplicate completed tasks that appear in both', () => {\n const store = createStore();\n store.setTasks([\n { label: 'Shared task', status: TaskStatus.Completed, done: true },\n ]);\n\n store.syncTodos([{ content: 'Shared task', status: 'completed' }]);\n\n // Should not have duplicates — incomingLabels includes \"Shared task\",\n // so the retained filter excludes it\n expect(store.tasks).toHaveLength(1);\n expect(store.tasks[0].label).toBe('Shared task');\n });\n\n it('preserves activeForm from incoming todos', () => {\n const store = createStore();\n store.syncTodos([\n {\n content: 'Installing',\n status: 'in_progress',\n activeForm: 'Installing SDK...',\n },\n ]);\n\n expect(store.tasks[0].activeForm).toBe('Installing SDK...');\n });\n\n it('emits change', () => {\n const store = createStore();\n const cb = jest.fn();\n store.subscribe(cb);\n store.syncTodos([{ content: 'task', status: 'pending' }]);\n expect(cb).toHaveBeenCalled();\n });\n });\n\n // ── Navigation direction ─────────────────────────────────────────\n\n describe('lastNavDirection', () => {\n it('starts as null', () => {\n const store = createStore();\n expect(store.lastNavDirection).toBeNull();\n });\n\n it('is set to push on emitChange', () => {\n const store = createStore();\n store.emitChange();\n expect(store.lastNavDirection).toBe('push');\n });\n });\n\n // ── Concurrent / rapid-fire mutations ─────────────────────────────\n\n describe('concurrent mutations', () => {\n it('rapid-fire setters each increment version by 1', () => {\n const store = createStore();\n const cb = jest.fn();\n store.subscribe(cb);\n\n store.completeSetup();\n store.setRunPhase(RunPhase.Running);\n store.pushStatus('msg1');\n store.pushStatus('msg2');\n store.setDetectedFramework('React');\n\n expect(store.getVersion()).toBe(5);\n expect(cb).toHaveBeenCalledTimes(5);\n });\n\n it('subscriber sees consistent state during a setter call', () => {\n const store = createStore();\n const snapshots: { confirmed: boolean; version: number }[] = [];\n\n store.subscribe(() => {\n snapshots.push({\n confirmed: store.session.setupConfirmed,\n version: store.getSnapshot(),\n });\n });\n\n store.completeSetup();\n\n expect(snapshots).toEqual([{ confirmed: true, version: 1 }]);\n });\n\n it('multiple subscribers all see the same state', () => {\n const store = createStore();\n const results: number[] = [];\n\n store.subscribe(() => results.push(store.getSnapshot()));\n store.subscribe(() => results.push(store.getSnapshot()));\n store.subscribe(() => results.push(store.getSnapshot()));\n\n store.completeSetup();\n\n // All 3 subscribers should see version 1\n expect(results).toEqual([1, 1, 1]);\n });\n\n it('subscriber that mutates store during notification triggers additional notifications', () => {\n const store = createStore();\n const versions: number[] = [];\n\n // First subscriber triggers another mutation\n store.subscribe(() => {\n versions.push(store.getSnapshot());\n if (\n store.session.setupConfirmed &&\n store.session.runPhase === RunPhase.Idle\n ) {\n store.setRunPhase(RunPhase.Running);\n }\n });\n\n store.completeSetup();\n\n // Should see version 1 (from completeSetup) and version 2 (from setRunPhase)\n expect(versions).toEqual([1, 2]);\n expect(store.session.runPhase).toBe(RunPhase.Running);\n });\n\n it('interleaved overlay and session mutations are all visible', () => {\n const store = createStore();\n const screens: string[] = [];\n\n store.subscribe(() => {\n screens.push(store.currentScreen);\n });\n\n store.completeSetup(); // -> health-check\n store.pushOverlay(Overlay.SettingsOverride); // -> settings-override\n store.setCredentials({\n // -> settings-override (overlay still on top)\n accessToken: 'tok',\n projectApiKey: 'pk',\n host: 'h',\n projectId: 1,\n });\n store.popOverlay(); // -> health-check (readinessResult still null)\n\n expect(screens).toEqual([\n Screen.HealthCheck,\n Overlay.SettingsOverride,\n Overlay.SettingsOverride,\n Screen.HealthCheck,\n ]);\n });\n\n it('unsubscribing mid-notification does not affect other subscribers', () => {\n const store = createStore();\n const log: string[] = [];\n\n store.subscribe(() => {\n log.push('sub1');\n });\n\n const unsub2 = store.subscribe(() => {\n log.push('sub2');\n });\n\n store.subscribe(() => {\n log.push('sub3');\n });\n\n store.emitChange();\n expect(log).toEqual(['sub1', 'sub2', 'sub3']);\n\n // Unsub the second listener\n unsub2();\n log.length = 0;\n store.emitChange();\n expect(log).toEqual(['sub1', 'sub3']);\n });\n });\n\n // ── Multiple subscribers ─────────────────────────────────────────\n\n describe('multiple subscribers', () => {\n it('supports many concurrent subscribers', () => {\n const store = createStore();\n const callbacks = Array.from({ length: 50 }, () => jest.fn());\n const unsubs = callbacks.map((cb) => store.subscribe(cb));\n\n store.emitChange();\n\n callbacks.forEach((cb) => expect(cb).toHaveBeenCalledTimes(1));\n\n // Unsubscribe all\n unsubs.forEach((unsub) => unsub());\n store.emitChange();\n\n // No more notifications\n callbacks.forEach((cb) => expect(cb).toHaveBeenCalledTimes(1));\n });\n\n it('double-unsubscribe is safe', () => {\n const store = createStore();\n const cb = jest.fn();\n const unsub = store.subscribe(cb);\n\n unsub();\n unsub(); // should not throw\n\n store.emitChange();\n expect(cb).not.toHaveBeenCalled();\n });\n });\n\n // ── Edge cases ───────────────────────────────────────────────────\n\n describe('edge cases', () => {\n it('setFrameworkContext overwrites existing keys', () => {\n const store = createStore();\n store.setFrameworkContext('key', 'value1');\n store.setFrameworkContext('key', 'value2');\n expect(store.session.frameworkContext['key']).toBe('value2');\n });\n\n it('setFrameworkConfig with null integration and config', () => {\n const store = createStore();\n store.setFrameworkConfig(null, null);\n expect(store.session.integration).toBeNull();\n expect(store.session.frameworkConfig).toBeNull();\n });\n\n it('pushStatus with empty string', () => {\n const store = createStore();\n store.pushStatus('');\n expect(store.statusMessages).toEqual(['']);\n });\n\n it('syncTodos with empty array clears non-completed tasks', () => {\n const store = createStore();\n store.setTasks([\n { label: 'Pending', status: TaskStatus.Pending, done: false },\n { label: 'Done', status: TaskStatus.Completed, done: true },\n ]);\n\n store.syncTodos([]);\n\n // Only the completed task is retained\n expect(store.tasks).toEqual([\n { label: 'Done', status: TaskStatus.Completed, done: true },\n ]);\n });\n\n it('syncTodos with unknown status defaults to Pending', () => {\n const store = createStore();\n store.syncTodos([{ content: 'Task', status: '' }]);\n expect(store.tasks[0].status).toBe(TaskStatus.Pending);\n });\n\n it('updateTask with negative index is a no-op', () => {\n const store = createStore();\n store.setTasks([\n { label: 'Task', status: TaskStatus.Pending, done: false },\n ]);\n const cb = jest.fn();\n store.subscribe(cb);\n store.updateTask(-1, true);\n expect(cb).not.toHaveBeenCalled();\n });\n\n it('popOverlay on empty stack does not crash', () => {\n const store = createStore();\n expect(() => store.popOverlay()).not.toThrow();\n expect(store.currentScreen).toBe(Screen.Intro);\n });\n\n it('screen advances to outro on RunPhase.Error too', () => {\n const store = createStore();\n store.completeSetup();\n store.setReadinessResult({\n decision: WizardReadiness.Yes,\n health: {} as never,\n reasons: [],\n });\n store.setCredentials({\n accessToken: 'tok',\n projectApiKey: 'pk',\n host: 'h',\n projectId: 1,\n });\n store.setRunPhase(RunPhase.Error);\n // Run is \"complete\" (either Completed or Error), so we advance past it\n expect(store.currentScreen).toBe(Screen.Mcp);\n });\n\n it('completeSetup can only resolve the promise once', async () => {\n const store = createStore();\n store.completeSetup();\n store.completeSetup(); // second call — promise already resolved\n\n await store.setupComplete;\n expect(store.session.setupConfirmed).toBe(true);\n });\n\n it('version property (string) is independent from internal _version counter', () => {\n const store = createStore();\n store.version = '1.2.3';\n expect(store.version).toBe('1.2.3');\n expect(store.getVersion()).toBe(0);\n\n store.emitChange();\n expect(store.version).toBe('1.2.3');\n expect(store.getVersion()).toBe(1);\n });\n });\n\n // ── Full wizard flow simulation ──────────────────────────────────\n\n describe('full wizard flow', () => {\n it('walks through the entire wizard flow correctly', () => {\n const store = createStore();\n const screenHistory: string[] = [];\n store.subscribe(() => screenHistory.push(store.currentScreen));\n\n expect(store.currentScreen).toBe(Screen.Intro);\n\n // Step 1: Confirm setup\n store.completeSetup();\n expect(store.currentScreen).toBe(Screen.HealthCheck);\n\n // Step 2: Health check passes\n store.setReadinessResult({\n decision: WizardReadiness.Yes,\n health: {} as never,\n reasons: [],\n });\n expect(store.currentScreen).toBe(Screen.Auth);\n\n // Step 3: Authenticate\n store.setCredentials({\n accessToken: 'tok',\n projectApiKey: 'pk',\n host: 'https://app.posthog.com',\n projectId: 1,\n });\n expect(store.currentScreen).toBe(Screen.Run);\n\n // Step 4: Start and complete run\n store.setRunPhase(RunPhase.Running);\n expect(store.currentScreen).toBe(Screen.Run);\n\n store.setRunPhase(RunPhase.Completed);\n expect(store.currentScreen).toBe(Screen.Mcp);\n\n // Step 5: Complete MCP\n store.setMcpComplete();\n expect(store.currentScreen).toBe(Screen.Outro);\n\n // Verify version was bumped for each setter call\n expect(store.getVersion()).toBe(6);\n });\n });\n\n // ── setupComplete promise ────────────────────────────────────────\n\n describe('setupComplete', () => {\n it('resolves when completeSetup is called', async () => {\n const store = createStore();\n store.completeSetup();\n await store.setupComplete;\n expect(store.session.setupConfirmed).toBe(true);\n });\n\n it('is a promise that can be awaited before completeSetup is called', async () => {\n const store = createStore();\n\n let resolved = false;\n void store.setupComplete.then(() => {\n resolved = true;\n });\n\n // Not yet resolved\n await Promise.resolve(); // flush microtasks\n expect(resolved).toBe(false);\n\n store.completeSetup();\n await store.setupComplete;\n expect(resolved).toBe(true);\n });\n });\n});\n"]}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * ServiceHealthList — Shared component for displaying service health status.
3
+ *
4
+ * Used by HealthCheckScreen (blocking services only) and HealthWarningsTab (all services).
5
+ */
6
+ import { type AllServicesHealth, type HealthCheckKey } from '../../../lib/health-checks/types.js';
7
+ interface ServiceHealthListProps {
8
+ health: AllServicesHealth;
9
+ /** If set, only show services with these keys */
10
+ filterKeys?: HealthCheckKey[];
11
+ /** Show healthy services (default true) */
12
+ showHealthy?: boolean;
13
+ }
14
+ export declare const ServiceHealthList: ({ health, filterKeys, showHealthy, }: ServiceHealthListProps) => import("react/jsx-runtime").JSX.Element;
15
+ export {};
@@ -0,0 +1,57 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * ServiceHealthList — Shared component for displaying service health status.
4
+ *
5
+ * Used by HealthCheckScreen (blocking services only) and HealthWarningsTab (all services).
6
+ */
7
+ import { Box, Text } from 'ink';
8
+ import { ServiceHealthStatus, } from '../../../lib/health-checks/types.js';
9
+ import { SERVICE_LABELS } from '../../../lib/health-checks/readiness.js';
10
+ import { Icons } from '../styles.js';
11
+ /** Keys that are component-level detail — shown inline under their parent. */
12
+ const COMPONENT_KEYS = [
13
+ 'posthogComponents',
14
+ 'npmComponents',
15
+ 'cloudflareComponents',
16
+ ];
17
+ /** Map component key → its parent "overall" key */
18
+ const COMPONENT_PARENT = {
19
+ posthogComponents: 'posthogOverall',
20
+ npmComponents: 'npmOverall',
21
+ cloudflareComponents: 'cloudflareOverall',
22
+ };
23
+ function statusIcon(status) {
24
+ switch (status) {
25
+ case ServiceHealthStatus.Down:
26
+ return { icon: Icons.squareFilled, color: 'red' };
27
+ case ServiceHealthStatus.Degraded:
28
+ return { icon: Icons.squareFilled, color: '#DC9300' };
29
+ case ServiceHealthStatus.Healthy:
30
+ return { icon: Icons.check, color: 'green' };
31
+ }
32
+ }
33
+ export const ServiceHealthList = ({ health, filterKeys, showHealthy = true, }) => {
34
+ const topLevelKeys = Object.keys(health).filter((k) => !COMPONENT_KEYS.includes(k));
35
+ const keysToShow = filterKeys
36
+ ? topLevelKeys.filter((k) => filterKeys.includes(k))
37
+ : topLevelKeys;
38
+ return (_jsx(Box, { flexDirection: "column", paddingLeft: 1, children: keysToShow.map((key) => {
39
+ const result = health[key];
40
+ if (!showHealthy && result.status === ServiceHealthStatus.Healthy) {
41
+ return null;
42
+ }
43
+ const { icon, color } = statusIcon(result.status);
44
+ const label = SERVICE_LABELS[key];
45
+ // Find component-level details if this is a parent key
46
+ const componentKey = Object.entries(COMPONENT_PARENT).find(([, parent]) => parent === key)?.[0];
47
+ const componentResult = componentKey
48
+ ? health[componentKey]
49
+ : undefined;
50
+ const affectedComponents = componentResult?.degradedOrDownComponents ?? [];
51
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { children: [_jsx(Text, { color: color, children: icon }), ' ', _jsx(Text, { bold: result.status !== ServiceHealthStatus.Healthy, children: label })] }), affectedComponents.length > 0 && (_jsxs(Box, { flexDirection: "column", paddingLeft: 3, children: [affectedComponents.slice(0, 5).map((c) => {
52
+ const ci = statusIcon(c.status);
53
+ return (_jsxs(Text, { dimColor: true, children: [_jsx(Text, { color: ci.color, children: ci.icon }), " ", c.name] }, c.name));
54
+ }), affectedComponents.length > 5 && (_jsxs(Text, { dimColor: true, children: ["+", affectedComponents.length - 5, " more"] }))] }))] }, key));
55
+ }) }));
56
+ };
57
+ //# sourceMappingURL=ServiceHealthList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServiceHealthList.js","sourceRoot":"","sources":["../../../../../src/ui/tui/components/ServiceHealthList.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * ServiceHealthList — Shared component for displaying service health status.\n *\n * Used by HealthCheckScreen (blocking services only) and HealthWarningsTab (all services).\n */\n\nimport { Box, Text } from 'ink';\nimport {\n ServiceHealthStatus,\n type AllServicesHealth,\n type ComponentHealthResult,\n type ComponentStatus,\n type HealthCheckKey,\n} from '../../../lib/health-checks/types.js';\nimport { SERVICE_LABELS } from '../../../lib/health-checks/readiness.js';\nimport { Icons } from '../styles.js';\n\n/** Keys that are component-level detail — shown inline under their parent. */\nconst COMPONENT_KEYS: HealthCheckKey[] = [\n 'posthogComponents',\n 'npmComponents',\n 'cloudflareComponents',\n];\n\n/** Map component key → its parent \"overall\" key */\nconst COMPONENT_PARENT: Partial<Record<HealthCheckKey, HealthCheckKey>> = {\n posthogComponents: 'posthogOverall',\n npmComponents: 'npmOverall',\n cloudflareComponents: 'cloudflareOverall',\n};\n\nfunction statusIcon(status: ServiceHealthStatus): {\n icon: string;\n color: string;\n} {\n switch (status) {\n case ServiceHealthStatus.Down:\n return { icon: Icons.squareFilled, color: 'red' };\n case ServiceHealthStatus.Degraded:\n return { icon: Icons.squareFilled, color: '#DC9300' };\n case ServiceHealthStatus.Healthy:\n return { icon: Icons.check, color: 'green' };\n }\n}\n\ninterface ServiceHealthListProps {\n health: AllServicesHealth;\n /** If set, only show services with these keys */\n filterKeys?: HealthCheckKey[];\n /** Show healthy services (default true) */\n showHealthy?: boolean;\n}\n\nexport const ServiceHealthList = ({\n health,\n filterKeys,\n showHealthy = true,\n}: ServiceHealthListProps) => {\n const topLevelKeys = (Object.keys(health) as HealthCheckKey[]).filter(\n (k) => !COMPONENT_KEYS.includes(k),\n );\n\n const keysToShow = filterKeys\n ? topLevelKeys.filter((k) => filterKeys.includes(k))\n : topLevelKeys;\n\n return (\n <Box flexDirection=\"column\" paddingLeft={1}>\n {keysToShow.map((key) => {\n const result = health[key];\n if (!showHealthy && result.status === ServiceHealthStatus.Healthy) {\n return null;\n }\n\n const { icon, color } = statusIcon(result.status);\n const label = SERVICE_LABELS[key];\n\n // Find component-level details if this is a parent key\n const componentKey = (\n Object.entries(COMPONENT_PARENT) as [HealthCheckKey, HealthCheckKey][]\n ).find(([, parent]) => parent === key)?.[0];\n const componentResult = componentKey\n ? (health[componentKey] as ComponentHealthResult)\n : undefined;\n const affectedComponents: ComponentStatus[] =\n componentResult?.degradedOrDownComponents ?? [];\n\n return (\n <Box key={key} flexDirection=\"column\">\n <Text>\n <Text color={color}>{icon}</Text>{' '}\n <Text bold={result.status !== ServiceHealthStatus.Healthy}>\n {label}\n </Text>\n </Text>\n {affectedComponents.length > 0 && (\n <Box flexDirection=\"column\" paddingLeft={3}>\n {affectedComponents.slice(0, 5).map((c) => {\n const ci = statusIcon(c.status);\n return (\n <Text key={c.name} dimColor>\n <Text color={ci.color}>{ci.icon}</Text> {c.name}\n </Text>\n );\n })}\n {affectedComponents.length > 5 && (\n <Text dimColor>+{affectedComponents.length - 5} more</Text>\n )}\n </Box>\n )}\n </Box>\n );\n })}\n </Box>\n );\n};\n"]}