chenbhao commited on
Commit
3199d61
Β·
1 Parent(s): 3decf19

chore: use pre-compiler code

Browse files
src/components/LogoV2/AnimatedClawd.tsx CHANGED
@@ -1,22 +1,14 @@
1
- import { c as _c } from "react/compiler-runtime";
2
- import * as React from 'react';
3
- import { useEffect, useRef, useState } from 'react';
4
- import { Box } from '../../ink.js';
5
- import { getInitialSettings } from '../../utils/settings/settings.js';
6
- import { Clawd, type ClawdPose } from './Clawd.js';
7
- type Frame = {
8
- pose: ClawdPose;
9
- offset: number;
10
- };
11
 
12
  /** Hold a pose for n frames (60ms each). */
13
  function hold(pose: ClawdPose, offset: number, frames: number): Frame[] {
14
- return Array.from({
15
- length: frames
16
- }, () => ({
17
- pose,
18
- offset
19
- }));
20
  }
21
 
22
  // Offset semantics: marginTop in a fixed-height-3 container. 0 = normal,
@@ -25,26 +17,28 @@ function hold(pose: ClawdPose, offset: number, frames: number): Frame[] {
25
  // clipped β€” reads as "ducking below the frame" before springing back up.
26
 
27
  // Click animation: crouch, then spring up with both arms raised. Twice.
28
- const JUMP_WAVE: readonly Frame[] = [...hold('default', 1, 2),
29
- // crouch
30
- ...hold('arms-up', 0, 3),
31
- // spring!
32
- ...hold('default', 0, 1), ...hold('default', 1, 2),
33
- // crouch again
34
- ...hold('arms-up', 0, 3),
35
- // spring!
36
- ...hold('default', 0, 1)];
37
 
38
  // Click animation: glance right, then left, then back.
39
- const LOOK_AROUND: readonly Frame[] = [...hold('look-right', 0, 5), ...hold('look-left', 0, 5), ...hold('default', 0, 1)];
40
- const CLICK_ANIMATIONS: readonly (readonly Frame[])[] = [JUMP_WAVE, LOOK_AROUND];
41
- const IDLE: Frame = {
42
- pose: 'default',
43
- offset: 0
44
- };
45
- const FRAME_MS = 60;
46
- const incrementFrame = (i: number) => i + 1;
47
- const CLAWD_HEIGHT = 3;
 
 
 
48
 
49
  /**
50
  * Clawd with click-triggered animations (crouch-jump with arms up, or
@@ -54,71 +48,49 @@ const CLAWD_HEIGHT = 3;
54
  * mouse tracking is enabled (i.e. inside `<AlternateScreen>` / fullscreen);
55
  * elsewhere this renders and behaves identically to plain `<Clawd />`.
56
  */
57
- export function AnimatedClawd() {
58
- const $ = _c(8);
59
- const {
60
- pose,
61
- bounceOffset,
62
- onClick
63
- } = useClawdAnimation();
64
- let t0;
65
- if ($[0] !== pose) {
66
- t0 = <Clawd pose={pose} />;
67
- $[0] = pose;
68
- $[1] = t0;
69
- } else {
70
- t0 = $[1];
71
- }
72
- let t1;
73
- if ($[2] !== bounceOffset || $[3] !== t0) {
74
- t1 = <Box marginTop={bounceOffset} flexShrink={0}>{t0}</Box>;
75
- $[2] = bounceOffset;
76
- $[3] = t0;
77
- $[4] = t1;
78
- } else {
79
- t1 = $[4];
80
- }
81
- let t2;
82
- if ($[5] !== onClick || $[6] !== t1) {
83
- t2 = <Box height={CLAWD_HEIGHT} flexDirection="column" onClick={onClick}>{t1}</Box>;
84
- $[5] = onClick;
85
- $[6] = t1;
86
- $[7] = t2;
87
- } else {
88
- t2 = $[7];
89
- }
90
- return t2;
91
  }
 
92
  function useClawdAnimation(): {
93
- pose: ClawdPose;
94
- bounceOffset: number;
95
- onClick: () => void;
96
  } {
97
  // Read once at mount β€” no useSettings() subscription, since that would
98
  // re-render on any settings change.
99
- const [reducedMotion] = useState(() => getInitialSettings().prefersReducedMotion ?? false);
100
- const [frameIndex, setFrameIndex] = useState(-1);
101
- const sequenceRef = useRef<readonly Frame[]>(JUMP_WAVE);
 
 
 
102
  const onClick = () => {
103
- if (reducedMotion || frameIndex !== -1) return;
104
- sequenceRef.current = CLICK_ANIMATIONS[Math.floor(Math.random() * CLICK_ANIMATIONS.length)]!;
105
- setFrameIndex(0);
106
- };
 
 
107
  useEffect(() => {
108
- if (frameIndex === -1) return;
109
  if (frameIndex >= sequenceRef.current.length) {
110
- setFrameIndex(-1);
111
- return;
112
  }
113
- const timer = setTimeout(setFrameIndex, FRAME_MS, incrementFrame);
114
- return () => clearTimeout(timer);
115
- }, [frameIndex]);
116
- const seq = sequenceRef.current;
117
- const current = frameIndex >= 0 && frameIndex < seq.length ? seq[frameIndex]! : IDLE;
118
- return {
119
- pose: current.pose,
120
- bounceOffset: current.offset,
121
- onClick
122
- };
123
  }
124
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZUVmZmVjdCIsInVzZVJlZiIsInVzZVN0YXRlIiwiQm94IiwiZ2V0SW5pdGlhbFNldHRpbmdzIiwiQ2xhd2QiLCJDbGF3ZFBvc2UiLCJGcmFtZSIsInBvc2UiLCJvZmZzZXQiLCJob2xkIiwiZnJhbWVzIiwiQXJyYXkiLCJmcm9tIiwibGVuZ3RoIiwiSlVNUF9XQVZFIiwiTE9PS19BUk9VTkQiLCJDTElDS19BTklNQVRJT05TIiwiSURMRSIsIkZSQU1FX01TIiwiaW5jcmVtZW50RnJhbWUiLCJpIiwiQ0xBV0RfSEVJR0hUIiwiQW5pbWF0ZWRDbGF3ZCIsIiQiLCJfYyIsImJvdW5jZU9mZnNldCIsIm9uQ2xpY2siLCJ1c2VDbGF3ZEFuaW1hdGlvbiIsInQwIiwidDEiLCJ0MiIsInJlZHVjZWRNb3Rpb24iLCJwcmVmZXJzUmVkdWNlZE1vdGlvbiIsImZyYW1lSW5kZXgiLCJzZXRGcmFtZUluZGV4Iiwic2VxdWVuY2VSZWYiLCJjdXJyZW50IiwiTWF0aCIsImZsb29yIiwicmFuZG9tIiwidGltZXIiLCJzZXRUaW1lb3V0IiwiY2xlYXJUaW1lb3V0Iiwic2VxIl0sInNvdXJjZXMiOlsiQW5pbWF0ZWRDbGF3ZC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IEJveCB9IGZyb20gJy4uLy4uL2luay5qcydcbmltcG9ydCB7IGdldEluaXRpYWxTZXR0aW5ncyB9IGZyb20gJy4uLy4uL3V0aWxzL3NldHRpbmdzL3NldHRpbmdzLmpzJ1xuaW1wb3J0IHsgQ2xhd2QsIHR5cGUgQ2xhd2RQb3NlIH0gZnJvbSAnLi9DbGF3ZC5qcydcblxudHlwZSBGcmFtZSA9IHsgcG9zZTogQ2xhd2RQb3NlOyBvZmZzZXQ6IG51bWJlciB9XG5cbi8qKiBIb2xkIGEgcG9zZSBmb3IgbiBmcmFtZXMgKDYwbXMgZWFjaCkuICovXG5mdW5jdGlvbiBob2xkKHBvc2U6IENsYXdkUG9zZSwgb2Zmc2V0OiBudW1iZXIsIGZyYW1lczogbnVtYmVyKTogRnJhbWVbXSB7XG4gIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBmcmFtZXMgfSwgKCkgPT4gKHsgcG9zZSwgb2Zmc2V0IH0pKVxufVxuXG4vLyBPZmZzZXQgc2VtYW50aWNzOiBtYXJnaW5Ub3AgaW4gYSBmaXhlZC1oZWlnaHQtMyBjb250YWluZXIuIDAgPSBub3JtYWwsXG4vLyAxID0gY3JvdWNoZWQuIENvbnRhaW5lciBoZWlnaHQgc3RheXMgMyBzbyB0aGUgbGF5b3V0IG5ldmVyIHNoaWZ0czsgZHVyaW5nXG4vLyBhIGNyb3VjaCAob2Zmc2V0PTEpIENsYXdkJ3MgZmVldCByb3cgZGlwcyBiZWxvdyB0aGUgY29udGFpbmVyIGFuZCBnZXRzXG4vLyBjbGlwcGVkIOKAlCByZWFkcyBhcyBcImR1Y2tpbmcgYmVsb3cgdGhlIGZyYW1lXCIgYmVmb3JlIHNwcmluZ2luZyBiYWNrIHVwLlxuXG4vLyBDbGljayBhbmltYXRpb246IGNyb3VjaCwgdGhlbiBzcHJpbmcgdXAgd2l0aCBib3RoIGFybXMgcmFpc2VkLiBUd2ljZS5cbmNvbnN0IEpVTVBfV0FWRTogcmVhZG9ubHkgRnJhbWVbXSA9IFtcbiAgLi4uaG9sZCgnZGVmYXVsdCcsIDEsIDIpLCAvLyBjcm91Y2hcbiAgLi4uaG9sZCgnYXJtcy11cCcsIDAsIDMpLCAvLyBzcHJpbmchXG4gIC4uLmhvbGQoJ2RlZmF1bHQnLCAwLCAxKSxcbiAgLi4uaG9sZCgnZGVmYXVsdCcsIDEsIDIpLCAvLyBjcm91Y2ggYWdhaW5cbiAgLi4uaG9sZCgnYXJtcy11cCcsIDAsIDMpLCAvLyBzcHJpbmchXG4gIC4uLmhvbGQoJ2RlZmF1bHQnLCAwLCAxKSxcbl1cblxuLy8gQ2xpY2sgYW5pbWF0aW9uOiBnbGFuY2UgcmlnaHQsIHRoZW4gbGVmdCwgdGhlbiBiYWNrLlxuY29uc3QgTE9PS19BUk9VTkQ6IHJlYWRvbmx5IEZyYW1lW10gPSBbXG4gIC4uLmhvbGQoJ2xvb2stcmlnaHQnLCAwLCA1KSxcbiAgLi4uaG9sZCgnbG9vay1sZWZ0JywgMCwgNSksXG4gIC4uLmhvbGQoJ2RlZmF1bHQnLCAwLCAxKSxcbl1cblxuY29uc3QgQ0xJQ0tfQU5JTUFUSU9OUzogcmVhZG9ubHkgKHJlYWRvbmx5IEZyYW1lW10pW10gPSBbSlVNUF9XQVZFLCBMT09LX0FST1VORF1cblxuY29uc3QgSURMRTogRnJhbWUgPSB7IHBvc2U6ICdkZWZhdWx0Jywgb2Zmc2V0OiAwIH1cbmNvbnN0IEZSQU1FX01TID0gNjBcbmNvbnN0IGluY3JlbWVudEZyYW1lID0gKGk6IG51bWJlcikgPT4gaSArIDFcbmNvbnN0IENMQVdEX0hFSUdIVCA9IDNcblxuLyoqXG4gKiBDbGF3ZCB3aXRoIGNsaWNrLXRyaWdnZXJlZCBhbmltYXRpb25zIChjcm91Y2gtanVtcCB3aXRoIGFybXMgdXAsIG9yXG4gKiBsb29rLWFyb3VuZCkuIENvbnRhaW5lciBoZWlnaHQgaXMgZml4ZWQgYXQgQ0xBV0RfSEVJR0hUIOKAlCBzYW1lIGZvb3RwcmludFxuICogYXMgYSBiYXJlIGA8Q2xhd2QgLz5gIOKAlCBzbyB0aGUgc3Vycm91bmRpbmcgbGF5b3V0IG5ldmVyIHNoaWZ0cy4gRHVyaW5nIGFcbiAqIGNyb3VjaCBvbmx5IHRoZSBmZWV0IHJvdyBjbGlwcyAoc2VlIGNvbW1lbnQgYWJvdmUpLiBDbGljayBvbmx5IGZpcmVzIHdoZW5cbiAqIG1vdXNlIHRyYWNraW5nIGlzIGVuYWJsZWQgKGkuZS4gaW5zaWRlIGA8QWx0ZXJuYXRlU2NyZWVuPmAgLyBmdWxsc2NyZWVuKTtcbiAqIGVsc2V3aGVyZSB0aGlzIHJlbmRlcnMgYW5kIGJlaGF2ZXMgaWRlbnRpY2FsbHkgdG8gcGxhaW4gYDxDbGF3ZCAvPmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBBbmltYXRlZENsYXdkKCk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGNvbnN0IHsgcG9zZSwgYm91bmNlT2Zmc2V0LCBvbkNsaWNrIH0gPSB1c2VDbGF3ZEFuaW1hdGlvbigpXG4gIHJldHVybiAoXG4gICAgPEJveCBoZWlnaHQ9e0NMQVdEX0hFSUdIVH0gZmxleERpcmVjdGlvbj1cImNvbHVtblwiIG9uQ2xpY2s9e29uQ2xpY2t9PlxuICAgICAgPEJveCBtYXJnaW5Ub3A9e2JvdW5jZU9mZnNldH0gZmxleFNocmluaz17MH0+XG4gICAgICAgIDxDbGF3ZCBwb3NlPXtwb3NlfSAvPlxuICAgICAgPC9Cb3g+XG4gICAgPC9Cb3g+XG4gIClcbn1cblxuZnVuY3Rpb24gdXNlQ2xhd2RBbmltYXRpb24oKToge1xuICBwb3NlOiBDbGF3ZFBvc2VcbiAgYm91bmNlT2Zmc2V0OiBudW1iZXJcbiAgb25DbGljazogKCkgPT4gdm9pZFxufSB7XG4gIC8vIFJlYWQgb25jZSBhdCBtb3VudCDigJQgbm8gdXNlU2V0dGluZ3MoKSBzdWJzY3JpcHRpb24sIHNpbmNlIHRoYXQgd291bGRcbiAgLy8gcmUtcmVuZGVyIG9uIGFueSBzZXR0aW5ncyBjaGFuZ2UuXG4gIGNvbnN0IFtyZWR1Y2VkTW90aW9uXSA9IHVzZVN0YXRlKFxuICAgICgpID0+IGdldEluaXRpYWxTZXR0aW5ncygpLnByZWZlcnNSZWR1Y2VkTW90aW9uID8/IGZhbHNlLFxuICApXG4gIGNvbnN0IFtmcmFtZUluZGV4LCBzZXRGcmFtZUluZGV4XSA9IHVzZVN0YXRlKC0xKVxuICBjb25zdCBzZXF1ZW5jZVJlZiA9IHVzZVJlZjxyZWFkb25seSBGcmFtZVtdPihKVU1QX1dBVkUpXG5cbiAgY29uc3Qgb25DbGljayA9ICgpID0+IHtcbiAgICBpZiAocmVkdWNlZE1vdGlvbiB8fCBmcmFtZUluZGV4ICE9PSAtMSkgcmV0dXJuXG4gICAgc2VxdWVuY2VSZWYuY3VycmVudCA9XG4gICAgICBDTElDS19BTklNQVRJT05TW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIENMSUNLX0FOSU1BVElPTlMubGVuZ3RoKV0hXG4gICAgc2V0RnJhbWVJbmRleCgwKVxuICB9XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoZnJhbWVJbmRleCA9PT0gLTEpIHJldHVyblxuICAgIGlmIChmcmFtZUluZGV4ID49IHNlcXVlbmNlUmVmLmN1cnJlbnQubGVuZ3RoKSB7XG4gICAgICBzZXRGcmFtZUluZGV4KC0xKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dChzZXRGcmFtZUluZGV4LCBGUkFNRV9NUywgaW5jcmVtZW50RnJhbWUpXG4gICAgcmV0dXJuICgpID0+IGNsZWFyVGltZW91dCh0aW1lcilcbiAgfSwgW2ZyYW1lSW5kZXhdKVxuXG4gIGNvbnN0IHNlcSA9IHNlcXVlbmNlUmVmLmN1cnJlbnRcbiAgY29uc3QgY3VycmVudCA9XG4gICAgZnJhbWVJbmRleCA+PSAwICYmIGZyYW1lSW5kZXggPCBzZXEubGVuZ3RoID8gc2VxW2ZyYW1lSW5kZXhdISA6IElETEVcbiAgcmV0dXJuIHsgcG9zZTogY3VycmVudC5wb3NlLCBib3VuY2VPZmZzZXQ6IGN1cnJlbnQub2Zmc2V0LCBvbkNsaWNrIH1cbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sS0FBS0EsS0FBSyxNQUFNLE9BQU87QUFDOUIsU0FBU0MsU0FBUyxFQUFFQyxNQUFNLEVBQUVDLFFBQVEsUUFBUSxPQUFPO0FBQ25ELFNBQVNDLEdBQUcsUUFBUSxjQUFjO0FBQ2xDLFNBQVNDLGtCQUFrQixRQUFRLGtDQUFrQztBQUNyRSxTQUFTQyxLQUFLLEVBQUUsS0FBS0MsU0FBUyxRQUFRLFlBQVk7QUFFbEQsS0FBS0MsS0FBSyxHQUFHO0VBQUVDLElBQUksRUFBRUYsU0FBUztFQUFFRyxNQUFNLEVBQUUsTUFBTTtBQUFDLENBQUM7O0FBRWhEO0FBQ0EsU0FBU0MsSUFBSUEsQ0FBQ0YsSUFBSSxFQUFFRixTQUFTLEVBQUVHLE1BQU0sRUFBRSxNQUFNLEVBQUVFLE1BQU0sRUFBRSxNQUFNLENBQUMsRUFBRUosS0FBSyxFQUFFLENBQUM7RUFDdEUsT0FBT0ssS0FBSyxDQUFDQyxJQUFJLENBQUM7SUFBRUMsTUFBTSxFQUFFSDtFQUFPLENBQUMsRUFBRSxPQUFPO0lBQUVILElBQUk7SUFBRUM7RUFBTyxDQUFDLENBQUMsQ0FBQztBQUNqRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU1NLFNBQVMsRUFBRSxTQUFTUixLQUFLLEVBQUUsR0FBRyxDQUNsQyxHQUFHRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFBRTtBQUMxQixHQUFHQSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFBRTtBQUMxQixHQUFHQSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDeEIsR0FBR0EsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQUU7QUFDMUIsR0FBR0EsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQUU7QUFDMUIsR0FBR0EsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQ3pCOztBQUVEO0FBQ0EsTUFBTU0sV0FBVyxFQUFFLFNBQVNULEtBQUssRUFBRSxHQUFHLENBQ3BDLEdBQUdHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUMzQixHQUFHQSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDMUIsR0FBR0EsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQ3pCO0FBRUQsTUFBTU8sZ0JBQWdCLEVBQUUsU0FBUyxDQUFDLFNBQVNWLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDUSxTQUFTLEVBQUVDLFdBQVcsQ0FBQztBQUVoRixNQUFNRSxJQUFJLEVBQUVYLEtBQUssR0FBRztFQUFFQyxJQUFJLEVBQUUsU0FBUztFQUFFQyxNQUFNLEVBQUU7QUFBRSxDQUFDO0FBQ2xELE1BQU1VLFFBQVEsR0FBRyxFQUFFO0FBQ25CLE1BQU1DLGNBQWMsR0FBR0EsQ0FBQ0MsQ0FBQyxFQUFFLE1BQU0sS0FBS0EsQ0FBQyxHQUFHLENBQUM7QUFDM0MsTUFBTUMsWUFBWSxHQUFHLENBQUM7O0FBRXRCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLFNBQUFDLGNBQUE7RUFBQSxNQUFBQyxDQUFBLEdBQUFDLEVBQUE7RUFDTDtJQUFBakIsSUFBQTtJQUFBa0IsWUFBQTtJQUFBQztFQUFBLElBQXdDQyxpQkFBaUIsQ0FBQyxDQUFDO0VBQUEsSUFBQUMsRUFBQTtFQUFBLElBQUFMLENBQUEsUUFBQWhCLElBQUE7SUFJckRxQixFQUFBLElBQUMsS0FBSyxDQUFPckIsSUFBSSxDQUFKQSxLQUFHLENBQUMsR0FBSTtJQUFBZ0IsQ0FBQSxNQUFBaEIsSUFBQTtJQUFBZ0IsQ0FBQSxNQUFBSyxFQUFBO0VBQUE7SUFBQUEsRUFBQSxHQUFBTCxDQUFBO0VBQUE7RUFBQSxJQUFBTSxFQUFBO0VBQUEsSUFBQU4sQ0FBQSxRQUFBRSxZQUFBLElBQUFGLENBQUEsUUFBQUssRUFBQTtJQUR2QkMsRUFBQSxJQUFDLEdBQUcsQ0FBWUosU0FBWSxDQUFaQSxhQUFXLENBQUMsQ0FBYyxVQUFDLENBQUQsR0FBQyxDQUN6QyxDQUFBRyxFQUFvQixDQUN0QixFQUZDLEdBQUcsQ0FFRTtJQUFBTCxDQUFBLE1BQUFFLFlBQUE7SUFBQUYsQ0FBQSxNQUFBSyxFQUFBO0lBQUFMLENBQUEsTUFBQU0sRUFBQTtFQUFBO0lBQUFBLEVBQUEsR0FBQU4sQ0FBQTtFQUFBO0VBQUEsSUFBQU8sRUFBQTtFQUFBLElBQUFQLENBQUEsUUFBQUcsT0FBQSxJQUFBSCxDQUFBLFFBQUFNLEVBQUE7SUFIUkMsRUFBQSxJQUFDLEdBQUcsQ0FBU1QsTUFBWSxDQUFaQSxhQUFXLENBQUMsQ0FBZ0IsYUFBUSxDQUFSLFFBQVEsQ0FBVUssT0FBTyxDQUFQQSxRQUFNLENBQUMsQ0FDaEUsQ0FBQUcsRUFFSyxDQUNQLEVBSkMsR0FBRyxDQUlFO0lBQUFOLENBQUEsTUFBQUcsT0FBQTtJQUFBSCxDQUFBLE1BQUFNLEVBQUE7SUFBQU4sQ0FBQSxNQUFBTyxFQUFBO0VBQUE7SUFBQUEsRUFBQSxHQUFBUCxDQUFBO0VBQUE7RUFBQSxPQUpOTyxFQUlNO0FBQUE7QUFJVixTQUFTSCxpQkFBaUJBLENBQUEsQ0FBRSxFQUFFO0VBQzVCcEIsSUFBSSxFQUFFRixTQUFTO0VBQ2ZvQixZQUFZLEVBQUUsTUFBTTtFQUNwQkMsT0FBTyxFQUFFLEdBQUcsR0FBRyxJQUFJO0FBQ3JCLENBQUMsQ0FBQztFQUNBO0VBQ0E7RUFDQSxNQUFNLENBQUNLLGFBQWEsQ0FBQyxHQUFHOUIsUUFBUSxDQUM5QixNQUFNRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUM2QixvQkFBb0IsSUFBSSxLQUNyRCxDQUFDO0VBQ0QsTUFBTSxDQUFDQyxVQUFVLEVBQUVDLGFBQWEsQ0FBQyxHQUFHakMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2hELE1BQU1rQyxXQUFXLEdBQUduQyxNQUFNLENBQUMsU0FBU00sS0FBSyxFQUFFLENBQUMsQ0FBQ1EsU0FBUyxDQUFDO0VBRXZELE1BQU1ZLE9BQU8sR0FBR0EsQ0FBQSxLQUFNO0lBQ3BCLElBQUlLLGFBQWEsSUFBSUUsVUFBVSxLQUFLLENBQUMsQ0FBQyxFQUFFO0lBQ3hDRSxXQUFXLENBQUNDLE9BQU8sR0FDakJwQixnQkFBZ0IsQ0FBQ3FCLElBQUksQ0FBQ0MsS0FBSyxDQUFDRCxJQUFJLENBQUNFLE1BQU0sQ0FBQyxDQUFDLEdBQUd2QixnQkFBZ0IsQ0FBQ0gsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUN4RXFCLGFBQWEsQ0FBQyxDQUFDLENBQUM7RUFDbEIsQ0FBQztFQUVEbkMsU0FBUyxDQUFDLE1BQU07SUFDZCxJQUFJa0MsVUFBVSxLQUFLLENBQUMsQ0FBQyxFQUFFO0lBQ3ZCLElBQUlBLFVBQVUsSUFBSUUsV0FBVyxDQUFDQyxPQUFPLENBQUN2QixNQUFNLEVBQUU7TUFDNUNxQixhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDakI7SUFDRjtJQUNBLE1BQU1NLEtBQUssR0FBR0MsVUFBVSxDQUFDUCxhQUFhLEVBQUVoQixRQUFRLEVBQUVDLGNBQWMsQ0FBQztJQUNqRSxPQUFPLE1BQU11QixZQUFZLENBQUNGLEtBQUssQ0FBQztFQUNsQyxDQUFDLEVBQUUsQ0FBQ1AsVUFBVSxDQUFDLENBQUM7RUFFaEIsTUFBTVUsR0FBRyxHQUFHUixXQUFXLENBQUNDLE9BQU87RUFDL0IsTUFBTUEsT0FBTyxHQUNYSCxVQUFVLElBQUksQ0FBQyxJQUFJQSxVQUFVLEdBQUdVLEdBQUcsQ0FBQzlCLE1BQU0sR0FBRzhCLEdBQUcsQ0FBQ1YsVUFBVSxDQUFDLENBQUMsR0FBR2hCLElBQUk7RUFDdEUsT0FBTztJQUFFVixJQUFJLEVBQUU2QixPQUFPLENBQUM3QixJQUFJO0lBQUVrQixZQUFZLEVBQUVXLE9BQU8sQ0FBQzVCLE1BQU07SUFBRWtCO0VBQVEsQ0FBQztBQUN0RSIsImlnbm9yZUxpc3QiOltdfQ==
 
1
+ import * as React from 'react'
2
+ import { useEffect, useRef, useState } from 'react'
3
+ import { Box } from '../../ink.js'
4
+ import { getInitialSettings } from '../../utils/settings/settings.js'
5
+ import { Clawd, type ClawdPose } from './Clawd.js'
6
+
7
+ type Frame = { pose: ClawdPose; offset: number }
 
 
 
8
 
9
  /** Hold a pose for n frames (60ms each). */
10
  function hold(pose: ClawdPose, offset: number, frames: number): Frame[] {
11
+ return Array.from({ length: frames }, () => ({ pose, offset }))
 
 
 
 
 
12
  }
13
 
14
  // Offset semantics: marginTop in a fixed-height-3 container. 0 = normal,
 
17
  // clipped β€” reads as "ducking below the frame" before springing back up.
18
 
19
  // Click animation: crouch, then spring up with both arms raised. Twice.
20
+ const JUMP_WAVE: readonly Frame[] = [
21
+ ...hold('default', 1, 2), // crouch
22
+ ...hold('arms-up', 0, 3), // spring!
23
+ ...hold('default', 0, 1),
24
+ ...hold('default', 1, 2), // crouch again
25
+ ...hold('arms-up', 0, 3), // spring!
26
+ ...hold('default', 0, 1),
27
+ ]
 
28
 
29
  // Click animation: glance right, then left, then back.
30
+ const LOOK_AROUND: readonly Frame[] = [
31
+ ...hold('look-right', 0, 5),
32
+ ...hold('look-left', 0, 5),
33
+ ...hold('default', 0, 1),
34
+ ]
35
+
36
+ const CLICK_ANIMATIONS: readonly (readonly Frame[])[] = [JUMP_WAVE, LOOK_AROUND]
37
+
38
+ const IDLE: Frame = { pose: 'default', offset: 0 }
39
+ const FRAME_MS = 60
40
+ const incrementFrame = (i: number) => i + 1
41
+ const CLAWD_HEIGHT = 3
42
 
43
  /**
44
  * Clawd with click-triggered animations (crouch-jump with arms up, or
 
48
  * mouse tracking is enabled (i.e. inside `<AlternateScreen>` / fullscreen);
49
  * elsewhere this renders and behaves identically to plain `<Clawd />`.
50
  */
51
+ export function AnimatedClawd(): React.ReactNode {
52
+ const { pose, bounceOffset, onClick } = useClawdAnimation()
53
+ return (
54
+ <Box height={CLAWD_HEIGHT} flexDirection="column" onClick={onClick}>
55
+ <Box marginTop={bounceOffset} flexShrink={0}>
56
+ <Clawd pose={pose} />
57
+ </Box>
58
+ </Box>
59
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60
  }
61
+
62
  function useClawdAnimation(): {
63
+ pose: ClawdPose
64
+ bounceOffset: number
65
+ onClick: () => void
66
  } {
67
  // Read once at mount β€” no useSettings() subscription, since that would
68
  // re-render on any settings change.
69
+ const [reducedMotion] = useState(
70
+ () => getInitialSettings().prefersReducedMotion ?? false,
71
+ )
72
+ const [frameIndex, setFrameIndex] = useState(-1)
73
+ const sequenceRef = useRef<readonly Frame[]>(JUMP_WAVE)
74
+
75
  const onClick = () => {
76
+ if (reducedMotion || frameIndex !== -1) return
77
+ sequenceRef.current =
78
+ CLICK_ANIMATIONS[Math.floor(Math.random() * CLICK_ANIMATIONS.length)]!
79
+ setFrameIndex(0)
80
+ }
81
+
82
  useEffect(() => {
83
+ if (frameIndex === -1) return
84
  if (frameIndex >= sequenceRef.current.length) {
85
+ setFrameIndex(-1)
86
+ return
87
  }
88
+ const timer = setTimeout(setFrameIndex, FRAME_MS, incrementFrame)
89
+ return () => clearTimeout(timer)
90
+ }, [frameIndex])
91
+
92
+ const seq = sequenceRef.current
93
+ const current =
94
+ frameIndex >= 0 && frameIndex < seq.length ? seq[frameIndex]! : IDLE
95
+ return { pose: current.pose, bounceOffset: current.offset, onClick }
 
 
96
  }
 
src/components/LogoV2/ChannelsNotice.tsx CHANGED
@@ -1,266 +1,208 @@
1
- import { c as _c } from "react/compiler-runtime";
2
  // Conditionally require()'d in LogoV2.tsx behind feature('KAIROS') ||
3
  // feature('KAIROS_CHANNELS'). No feature() guard here β€” the whole file
4
  // tree-shakes via the require pattern when both flags are false (see
5
  // docs/feature-gating.md). Do NOT import this module statically from
6
  // unguarded code.
7
 
8
- import * as React from 'react';
9
- import { useState } from 'react';
10
- import { type ChannelEntry, getAllowedChannels, getHasDevChannels } from '../../bootstrap/state.js';
11
- import { Box, Text } from '../../ink.js';
12
- import { isChannelsEnabled } from '../../services/mcp/channelAllowlist.js';
13
- import { getEffectiveChannelAllowlist } from '../../services/mcp/channelNotification.js';
14
- import { getMcpConfigsByScope } from '../../services/mcp/config.js';
15
- import { getClaudeAIOAuthTokens, getSubscriptionType } from '../../utils/auth.js';
16
- import { loadInstalledPluginsV2 } from '../../utils/plugins/installedPluginsManager.js';
17
- import { getSettingsForSource } from '../../utils/settings/settings.js';
18
- export function ChannelsNotice() {
19
- const $ = _c(32);
20
- const [t0] = useState(_temp);
21
- const {
22
- channels,
23
- disabled,
24
- noAuth,
25
- policyBlocked,
26
- list,
27
- unmatched
28
- } = t0;
29
- if (channels.length === 0) {
30
- return null;
31
- }
32
- const hasNonDev = channels.some(_temp2);
33
- const flag = getHasDevChannels() && hasNonDev ? "Channels" : getHasDevChannels() ? "--dangerously-load-development-channels" : "--channels";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
34
  if (disabled) {
35
- let t1;
36
- if ($[0] !== flag || $[1] !== list) {
37
- t1 = <Text color="error">{flag} ignored ({list})</Text>;
38
- $[0] = flag;
39
- $[1] = list;
40
- $[2] = t1;
41
- } else {
42
- t1 = $[2];
43
- }
44
- let t2;
45
- if ($[3] === Symbol.for("react.memo_cache_sentinel")) {
46
- t2 = <Text dimColor={true}>Channels are not currently available</Text>;
47
- $[3] = t2;
48
- } else {
49
- t2 = $[3];
50
- }
51
- let t3;
52
- if ($[4] !== t1) {
53
- t3 = <Box paddingLeft={2} flexDirection="column">{t1}{t2}</Box>;
54
- $[4] = t1;
55
- $[5] = t3;
56
- } else {
57
- t3 = $[5];
58
- }
59
- return t3;
60
  }
 
61
  if (noAuth) {
62
- let t1;
63
- if ($[6] !== flag || $[7] !== list) {
64
- t1 = <Text color="error">{flag} ignored ({list})</Text>;
65
- $[6] = flag;
66
- $[7] = list;
67
- $[8] = t1;
68
- } else {
69
- t1 = $[8];
70
- }
71
- let t2;
72
- if ($[9] === Symbol.for("react.memo_cache_sentinel")) {
73
- t2 = <Text dimColor={true}>Channels require claude.ai authentication Β· run /login, then restart</Text>;
74
- $[9] = t2;
75
- } else {
76
- t2 = $[9];
77
- }
78
- let t3;
79
- if ($[10] !== t1) {
80
- t3 = <Box paddingLeft={2} flexDirection="column">{t1}{t2}</Box>;
81
- $[10] = t1;
82
- $[11] = t3;
83
- } else {
84
- t3 = $[11];
85
- }
86
- return t3;
87
  }
 
88
  if (policyBlocked) {
89
- let t1;
90
- if ($[12] !== flag || $[13] !== list) {
91
- t1 = <Text color="error">{flag} blocked by org policy ({list})</Text>;
92
- $[12] = flag;
93
- $[13] = list;
94
- $[14] = t1;
95
- } else {
96
- t1 = $[14];
97
- }
98
- let t2;
99
- let t3;
100
- if ($[15] === Symbol.for("react.memo_cache_sentinel")) {
101
- t2 = <Text dimColor={true}>Inbound messages will be silently dropped</Text>;
102
- t3 = <Text dimColor={true}>Have an administrator set channelsEnabled: true in managed settings to enable</Text>;
103
- $[15] = t2;
104
- $[16] = t3;
105
- } else {
106
- t2 = $[15];
107
- t3 = $[16];
108
- }
109
- let t4;
110
- if ($[17] !== unmatched) {
111
- t4 = unmatched.map(_temp3);
112
- $[17] = unmatched;
113
- $[18] = t4;
114
- } else {
115
- t4 = $[18];
116
- }
117
- let t5;
118
- if ($[19] !== t1 || $[20] !== t4) {
119
- t5 = <Box paddingLeft={2} flexDirection="column">{t1}{t2}{t3}{t4}</Box>;
120
- $[19] = t1;
121
- $[20] = t4;
122
- $[21] = t5;
123
- } else {
124
- t5 = $[21];
125
- }
126
- return t5;
127
  }
128
- let t1;
129
- if ($[22] !== list) {
130
- t1 = <Text color="error">Listening for channel messages from: {list}</Text>;
131
- $[22] = list;
132
- $[23] = t1;
133
- } else {
134
- t1 = $[23];
135
- }
136
- let t2;
137
- if ($[24] !== flag) {
138
- t2 = <Text dimColor={true}>Experimental Β· inbound messages will be pushed into this session, this carries prompt injection risks. Restart VersperClaw without {flag} to disable.</Text>;
139
- $[24] = flag;
140
- $[25] = t2;
141
- } else {
142
- t2 = $[25];
143
- }
144
- let t3;
145
- if ($[26] !== unmatched) {
146
- t3 = unmatched.map(_temp4);
147
- $[26] = unmatched;
148
- $[27] = t3;
149
- } else {
150
- t3 = $[27];
151
- }
152
- let t4;
153
- if ($[28] !== t1 || $[29] !== t2 || $[30] !== t3) {
154
- t4 = <Box paddingLeft={2} flexDirection="column">{t1}{t2}{t3}</Box>;
155
- $[28] = t1;
156
- $[29] = t2;
157
- $[30] = t3;
158
- $[31] = t4;
159
- } else {
160
- t4 = $[31];
161
- }
162
- return t4;
163
- }
164
- function _temp4(u_0) {
165
- return <Text key={`${formatEntry(u_0.entry)}:${u_0.why}`} color="warning">{formatEntry(u_0.entry)} Β· {u_0.why}</Text>;
166
- }
167
- function _temp3(u) {
168
- return <Text key={`${formatEntry(u.entry)}:${u.why}`} color="warning">{formatEntry(u.entry)} Β· {u.why}</Text>;
169
- }
170
- function _temp2(c) {
171
- return !c.dev;
172
- }
173
- function _temp() {
174
- const ch = getAllowedChannels();
175
- if (ch.length === 0) {
176
- return {
177
- channels: ch,
178
- disabled: false,
179
- noAuth: false,
180
- policyBlocked: false,
181
- list: "",
182
- unmatched: [] as Unmatched[]
183
- };
184
- }
185
- const l = ch.map(formatEntry).join(", ");
186
- const sub = getSubscriptionType();
187
- const managed = sub === "team" || sub === "enterprise";
188
- const policy = getSettingsForSource("policySettings");
189
- const allowlist = getEffectiveChannelAllowlist(sub, policy?.allowedChannelPlugins);
190
- return {
191
- channels: ch,
192
- disabled: !isChannelsEnabled(),
193
- noAuth: !getClaudeAIOAuthTokens()?.accessToken,
194
- policyBlocked: managed && policy?.channelsEnabled !== true,
195
- list: l,
196
- unmatched: findUnmatched(ch, allowlist)
197
- };
198
  }
 
199
  function formatEntry(c: ChannelEntry): string {
200
- return c.kind === 'plugin' ? `plugin:${c.name}@${c.marketplace}` : `server:${c.name}`;
 
 
201
  }
202
- type Unmatched = {
203
- entry: ChannelEntry;
204
- why: string;
205
- };
206
- function findUnmatched(entries: readonly ChannelEntry[], allowlist: ReturnType<typeof getEffectiveChannelAllowlist>): Unmatched[] {
 
 
207
  // Server-kind: build one Set from all scopes up front. getMcpConfigsByScope
208
  // is not cached (project scope walks the dir tree); getMcpConfigByName would
209
  // redo that walk per entry.
210
- const scopes = ['enterprise', 'user', 'project', 'local'] as const;
211
- const configured = new Set<string>();
212
  for (const scope of scopes) {
213
  for (const name of Object.keys(getMcpConfigsByScope(scope).servers)) {
214
- configured.add(name);
215
  }
216
  }
217
 
218
  // Plugin-kind installed check: installed_plugins.json keys are
219
  // `name@marketplace`. loadInstalledPluginsV2 is cached.
220
- const installedPluginIds = new Set(Object.keys(loadInstalledPluginsV2().plugins));
 
 
221
 
222
  // Plugin-kind allowlist check: same {marketplace, plugin} test as the
223
  // gate at channelNotification.ts. entry.dev bypasses (dev flag opts out
224
  // of the allowlist). Org list replaces ledger when set (team/enterprise).
225
  // GrowthBook _CACHED_MAY_BE_STALE β€” cold cache yields [] so every plugin
226
  // entry warns; same tradeoff the gate already accepts.
227
- const {
228
- entries: allowed,
229
- source
230
- } = allowlist;
231
 
232
  // Independent ifs β€” a plugin entry that's both uninstalled AND
233
  // unlisted shows two lines. Server kind checks config + dev flag.
234
- const out: Unmatched[] = [];
235
  for (const entry of entries) {
236
  if (entry.kind === 'server') {
237
  if (!configured.has(entry.name)) {
238
- out.push({
239
- entry,
240
- why: 'no MCP server configured with that name'
241
- });
242
  }
243
  if (!entry.dev) {
244
  out.push({
245
  entry,
246
- why: 'server: entries need --dangerously-load-development-channels'
247
- });
248
  }
249
- continue;
250
  }
251
  if (!installedPluginIds.has(`${entry.name}@${entry.marketplace}`)) {
252
- out.push({
253
- entry,
254
- why: 'plugin not installed'
255
- });
256
  }
257
- if (!entry.dev && !allowed.some(e => e.plugin === entry.name && e.marketplace === entry.marketplace)) {
 
 
 
 
 
258
  out.push({
259
  entry,
260
- why: source === 'org' ? "not on your org's approved channels list" : 'not on the approved channels allowlist'
261
- });
 
 
 
262
  }
263
  }
264
- return out;
265
  }
266
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZVN0YXRlIiwiQ2hhbm5lbEVudHJ5IiwiZ2V0QWxsb3dlZENoYW5uZWxzIiwiZ2V0SGFzRGV2Q2hhbm5lbHMiLCJCb3giLCJUZXh0IiwiaXNDaGFubmVsc0VuYWJsZWQiLCJnZXRFZmZlY3RpdmVDaGFubmVsQWxsb3dsaXN0IiwiZ2V0TWNwQ29uZmlnc0J5U2NvcGUiLCJnZXRDbGF1ZGVBSU9BdXRoVG9rZW5zIiwiZ2V0U3Vic2NyaXB0aW9uVHlwZSIsImxvYWRJbnN0YWxsZWRQbHVnaW5zVjIiLCJnZXRTZXR0aW5nc0ZvclNvdXJjZSIsIkNoYW5uZWxzTm90aWNlIiwiJCIsIl9jIiwidDAiLCJfdGVtcCIsImNoYW5uZWxzIiwiZGlzYWJsZWQiLCJub0F1dGgiLCJwb2xpY3lCbG9ja2VkIiwibGlzdCIsInVubWF0Y2hlZCIsImxlbmd0aCIsImhhc05vbkRldiIsInNvbWUiLCJfdGVtcDIiLCJmbGFnIiwidDEiLCJ0MiIsIlN5bWJvbCIsImZvciIsInQzIiwidDQiLCJtYXAiLCJfdGVtcDMiLCJ0NSIsIl90ZW1wNCIsInVfMCIsImZvcm1hdEVudHJ5IiwidSIsImVudHJ5Iiwid2h5IiwiYyIsImRldiIsImNoIiwiVW5tYXRjaGVkIiwibCIsImpvaW4iLCJzdWIiLCJtYW5hZ2VkIiwicG9saWN5IiwiYWxsb3dsaXN0IiwiYWxsb3dlZENoYW5uZWxQbHVnaW5zIiwiYWNjZXNzVG9rZW4iLCJjaGFubmVsc0VuYWJsZWQiLCJmaW5kVW5tYXRjaGVkIiwia2luZCIsIm5hbWUiLCJtYXJrZXRwbGFjZSIsImVudHJpZXMiLCJSZXR1cm5UeXBlIiwic2NvcGVzIiwiY29uc3QiLCJjb25maWd1cmVkIiwiU2V0Iiwic2NvcGUiLCJPYmplY3QiLCJrZXlzIiwic2VydmVycyIsImFkZCIsImluc3RhbGxlZFBsdWdpbklkcyIsInBsdWdpbnMiLCJhbGxvd2VkIiwic291cmNlIiwib3V0IiwiaGFzIiwicHVzaCIsImUiLCJwbHVnaW4iXSwic291cmNlcyI6WyJDaGFubmVsc05vdGljZS50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29uZGl0aW9uYWxseSByZXF1aXJlKCknZCBpbiBMb2dvVjIudHN4IGJlaGluZCBmZWF0dXJlKCdLQUlST1MnKSB8fFxuLy8gZmVhdHVyZSgnS0FJUk9TX0NIQU5ORUxTJykuIE5vIGZlYXR1cmUoKSBndWFyZCBoZXJlIOKAlCB0aGUgd2hvbGUgZmlsZVxuLy8gdHJlZS1zaGFrZXMgdmlhIHRoZSByZXF1aXJlIHBhdHRlcm4gd2hlbiBib3RoIGZsYWdzIGFyZSBmYWxzZSAoc2VlXG4vLyBkb2NzL2ZlYXR1cmUtZ2F0aW5nLm1kKS4gRG8gTk9UIGltcG9ydCB0aGlzIG1vZHVsZSBzdGF0aWNhbGx5IGZyb21cbi8vIHVuZ3VhcmRlZCBjb2RlLlxuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQge1xuICB0eXBlIENoYW5uZWxFbnRyeSxcbiAgZ2V0QWxsb3dlZENoYW5uZWxzLFxuICBnZXRIYXNEZXZDaGFubmVscyxcbn0gZnJvbSAnLi4vLi4vYm9vdHN0cmFwL3N0YXRlLmpzJ1xuaW1wb3J0IHsgQm94LCBUZXh0IH0gZnJvbSAnLi4vLi4vaW5rLmpzJ1xuaW1wb3J0IHsgaXNDaGFubmVsc0VuYWJsZWQgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tY3AvY2hhbm5lbEFsbG93bGlzdC5qcydcbmltcG9ydCB7IGdldEVmZmVjdGl2ZUNoYW5uZWxBbGxvd2xpc3QgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tY3AvY2hhbm5lbE5vdGlmaWNhdGlvbi5qcydcbmltcG9ydCB7IGdldE1jcENvbmZpZ3NCeVNjb3BlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbWNwL2NvbmZpZy5qcydcbmltcG9ydCB7XG4gIGdldENsYXVkZUFJT0F1dGhUb2tlbnMsXG4gIGdldFN1YnNjcmlwdGlvblR5cGUsXG59IGZyb20gJy4uLy4uL3V0aWxzL2F1dGguanMnXG5pbXBvcnQgeyBsb2FkSW5zdGFsbGVkUGx1Z2luc1YyIH0gZnJvbSAnLi4vLi4vdXRpbHMvcGx1Z2lucy9pbnN0YWxsZWRQbHVnaW5zTWFuYWdlci5qcydcbmltcG9ydCB7IGdldFNldHRpbmdzRm9yU291cmNlIH0gZnJvbSAnLi4vLi4vdXRpbHMvc2V0dGluZ3Mvc2V0dGluZ3MuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiBDaGFubmVsc05vdGljZSgpOiBSZWFjdC5SZWFjdE5vZGUge1xuICAvLyBTbmFwc2hvdCBhbGwgcmVhZHMgYXQgbW91bnQuIFRoaXMgbm90aWNlIGVudGVycyBzY3JvbGxiYWNrIGltbWVkaWF0ZWx5XG4gIC8vIGFmdGVyIHRoZSBsb2dvOyBhbnkgcmUtcmVuZGVyIHBhc3QgdGhhdCBwb2ludCBmb3JjZXMgYSBmdWxsIHRlcm1pbmFsXG4gIC8vIHJlc2V0LiBnZXRBbGxvd2VkQ2hhbm5lbHMgKGJvb3RzdHJhcCBzdGF0ZSksIGdldFNldHRpbmdzRm9yU291cmNlXG4gIC8vIChzZXNzaW9uIGNhY2hlIHVwZGF0ZWQgYnkgYmFja2dyb3VuZCBwb2xsaW5nIC8gL2xvZ2luKSwgYW5kXG4gIC8vIGlzQ2hhbm5lbHNFbmFibGVkIChHcm93dGhCb29rIDUtbWluIHJlZnJlc2gpIG11c3QgYmUgY2FwdHVyZWQgb25jZVxuICAvLyBzbyBhIGxhdGVyIHJlLXJlbmRlciBjYW5ub3QgZmxpcCBicmFuY2hlcy5cbiAgY29uc3QgW3sgY2hhbm5lbHMsIGRpc2FibGVkLCBub0F1dGgsIHBvbGljeUJsb2NrZWQsIGxpc3QsIHVubWF0Y2hlZCB9XSA9XG4gICAgdXNlU3RhdGUoKCkgPT4ge1xuICAgICAgY29uc3QgY2ggPSBnZXRBbGxvd2VkQ2hhbm5lbHMoKVxuICAgICAgaWYgKGNoLmxlbmd0aCA9PT0gMClcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjaGFubmVsczogY2gsXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgIG5vQXV0aDogZmFsc2UsXG4gICAgICAgICAgcG9saWN5QmxvY2tlZDogZmFsc2UsXG4gICAgICAgICAgbGlzdDogJycsXG4gICAgICAgICAgdW5tYXRjaGVkOiBbXSBhcyBVbm1hdGNoZWRbXSxcbiAgICAgICAgfVxuICAgICAgY29uc3QgbCA9IGNoLm1hcChmb3JtYXRFbnRyeSkuam9pbignLCAnKVxuICAgICAgY29uc3Qgc3ViID0gZ2V0U3Vic2NyaXB0aW9uVHlwZSgpXG4gICAgICBjb25zdCBtYW5hZ2VkID0gc3ViID09PSAndGVhbScgfHwgc3ViID09PSAnZW50ZXJwcmlzZSdcbiAgICAgIGNvbnN0IHBvbGljeSA9IGdldFNldHRpbmdzRm9yU291cmNlKCdwb2xpY3lTZXR0aW5ncycpXG4gICAgICBjb25zdCBhbGxvd2xpc3QgPSBnZXRFZmZlY3RpdmVDaGFubmVsQWxsb3dsaXN0KFxuICAgICAgICBzdWIsXG4gICAgICAgIHBvbGljeT8uYWxsb3dlZENoYW5uZWxQbHVnaW5zLFxuICAgICAgKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2hhbm5lbHM6IGNoLFxuICAgICAgICBkaXNhYmxlZDogIWlzQ2hhbm5lbHNFbmFibGVkKCksXG4gICAgICAgIG5vQXV0aDogIWdldENsYXVkZUFJT0F1dGhUb2tlbnMoKT8uYWNjZXNzVG9rZW4sXG4gICAgICAgIHBvbGljeUJsb2NrZWQ6IG1hbmFnZWQgJiYgcG9saWN5Py5jaGFubmVsc0VuYWJsZWQgIT09IHRydWUsXG4gICAgICAgIGxpc3Q6IGwsXG4gICAgICAgIHVubWF0Y2hlZDogZmluZFVubWF0Y2hlZChjaCwgYWxsb3dsaXN0KSxcbiAgICAgIH1cbiAgICB9KVxuICBpZiAoY2hhbm5lbHMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbFxuXG4gIC8vIFdoZW4gYm90aCBmbGFncyBhcmUgcGFzc2VkLCB0aGUgbGlzdCBtaXhlcyBlbnRyaWVzIGFuZCBhIHNpbmdsZSBmbGFnXG4gIC8vIG5hbWUgd291bGQgYmUgd3JvbmcgZm9yIGhhbGYgb2YgaXQuIGVudHJ5LmRldiBkaXN0aW5ndWlzaGVzIG9yaWdpbi5cbiAgY29uc3QgaGFzTm9uRGV2ID0gY2hhbm5lbHMuc29tZShjID0+ICFjLmRldilcbiAgY29uc3QgZmxhZyA9XG4gICAgZ2V0SGFzRGV2Q2hhbm5lbHMoKSAmJiBoYXNOb25EZXZcbiAgICAgID8gJ0NoYW5uZWxzJ1xuICAgICAgOiBnZXRIYXNEZXZDaGFubmVscygpXG4gICAgICAgID8gJy0tZGFuZ2Vyb3VzbHktbG9hZC1kZXZlbG9wbWVudC1jaGFubmVscydcbiAgICAgICAgOiAnLS1jaGFubmVscydcblxuICBpZiAoZGlzYWJsZWQpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEJveCBwYWRkaW5nTGVmdD17Mn0gZmxleERpcmVjdGlvbj1cImNvbHVtblwiPlxuICAgICAgICA8VGV4dCBjb2xvcj1cImVycm9yXCI+XG4gICAgICAgICAge2ZsYWd9IGlnbm9yZWQgKHtsaXN0fSlcbiAgICAgICAgPC9UZXh0PlxuICAgICAgICA8VGV4dCBkaW1Db2xvcj5DaGFubmVscyBhcmUgbm90IGN1cnJlbnRseSBhdmFpbGFibGU8L1RleHQ+XG4gICAgICA8L0JveD5cbiAgICApXG4gIH1cblxuICBpZiAobm9BdXRoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxCb3ggcGFkZGluZ0xlZnQ9ezJ9IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIj5cbiAgICAgICAgPFRleHQgY29sb3I9XCJlcnJvclwiPlxuICAgICAgICAgIHtmbGFnfSBpZ25vcmVkICh7bGlzdH0pXG4gICAgICAgIDwvVGV4dD5cbiAgICAgICAgPFRleHQgZGltQ29sb3I+XG4gICAgICAgICAgQ2hhbm5lbHMgcmVxdWlyZSBjbGF1ZGUuYWkgYXV0aGVudGljYXRpb24gwrcgcnVuIC9sb2dpbiwgdGhlbiByZXN0YXJ0XG4gICAgICAgIDwvVGV4dD5cbiAgICAgIDwvQm94PlxuICAgIClcbiAgfVxuXG4gIGlmIChwb2xpY3lCbG9ja2VkKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxCb3ggcGFkZGluZ0xlZnQ9ezJ9IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIj5cbiAgICAgICAgPFRleHQgY29sb3I9XCJlcnJvclwiPlxuICAgICAgICAgIHtmbGFnfSBibG9ja2VkIGJ5IG9yZyBwb2xpY3kgKHtsaXN0fSlcbiAgICAgICAgPC9UZXh0PlxuICAgICAgICA8VGV4dCBkaW1Db2xvcj5JbmJvdW5kIG1lc3NhZ2VzIHdpbGwgYmUgc2lsZW50bHkgZHJvcHBlZDwvVGV4dD5cbiAgICAgICAgPFRleHQgZGltQ29sb3I+XG4gICAgICAgICAgSGF2ZSBhbiBhZG1pbmlzdHJhdG9yIHNldCBjaGFubmVsc0VuYWJsZWQ6IHRydWUgaW4gbWFuYWdlZCBzZXR0aW5ncyB0b1xuICAgICAgICAgIGVuYWJsZVxuICAgICAgICA8L1RleHQ+XG4gICAgICAgIHt1bm1hdGNoZWQubWFwKHUgPT4gKFxuICAgICAgICAgIDxUZXh0IGtleT17YCR7Zm9ybWF0RW50cnkodS5lbnRyeSl9OiR7dS53aHl9YH0gY29sb3I9XCJ3YXJuaW5nXCI+XG4gICAgICAgICAgICB7Zm9ybWF0RW50cnkodS5lbnRyeSl9IMK3IHt1LndoeX1cbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICkpfVxuICAgICAgPC9Cb3g+XG4gICAgKVxuICB9XG5cbiAgLy8gXCJMaXN0ZW5pbmcgZm9yXCIgbm90IFwiYWN0aXZlXCIg4oCUIGF0IHRoaXMgcG9pbnQgd2Ugb25seSBrbm93IHRoZSBhbGxvd2xpc3RcbiAgLy8gd2FzIHNldC4gU2VydmVyIGNvbm5lY3Rpb24sIGNhcGFiaWxpdHkgZGVjbGFyYXRpb24sIGFuZCB3aGV0aGVyIHRoZSBuYW1lXG4gIC8vIGV2ZW4gbWF0Y2hlcyBhIGNvbmZpZ3VyZWQgTUNQIHNlcnZlciBhcmUgYWxsIHN0aWxsIHVua25vd24uXG4gIHJldHVybiAoXG4gICAgPEJveCBwYWRkaW5nTGVmdD17Mn0gZmxleERpcmVjdGlvbj1cImNvbHVtblwiPlxuICAgICAgPFRleHQgY29sb3I9XCJlcnJvclwiPkxpc3RlbmluZyBmb3IgY2hhbm5lbCBtZXNzYWdlcyBmcm9tOiB7bGlzdH08L1RleHQ+XG4gICAgICA8VGV4dCBkaW1Db2xvcj5cbiAgICAgICAgRXhwZXJpbWVudGFsIMK3IGluYm91bmQgbWVzc2FnZXMgd2lsbCBiZSBwdXNoZWQgaW50byB0aGlzIHNlc3Npb24sIHRoaXNcbiAgICAgICAgY2FycmllcyBwcm9tcHQgaW5qZWN0aW9uIHJpc2tzLiBSZXN0YXJ0IENsYXVkZSBDb2RlIHdpdGhvdXQge2ZsYWd9IHRvXG4gICAgICAgIGRpc2FibGUuXG4gICAgICA8L1RleHQ+XG4gICAgICB7dW5tYXRjaGVkLm1hcCh1ID0+IChcbiAgICAgICAgPFRleHQga2V5PXtgJHtmb3JtYXRFbnRyeSh1LmVudHJ5KX06JHt1LndoeX1gfSBjb2xvcj1cIndhcm5pbmdcIj5cbiAgICAgICAgICB7Zm9ybWF0RW50cnkodS5lbnRyeSl9IMK3IHt1LndoeX1cbiAgICAgICAgPC9UZXh0PlxuICAgICAgKSl9XG4gICAgPC9Cb3g+XG4gIClcbn1cblxuZnVuY3Rpb24gZm9ybWF0RW50cnkoYzogQ2hhbm5lbEVudHJ5KTogc3RyaW5nIHtcbiAgcmV0dXJuIGMua2luZCA9PT0gJ3BsdWdpbidcbiAgICA/IGBwbHVnaW46JHtjLm5hbWV9QCR7Yy5tYXJrZXRwbGFjZX1gXG4gICAgOiBgc2VydmVyOiR7Yy5uYW1lfWBcbn1cblxudHlwZSBVbm1hdGNoZWQgPSB7IGVudHJ5OiBDaGFubmVsRW50cnk7IHdoeTogc3RyaW5nIH1cblxuZnVuY3Rpb24gZmluZFVubWF0Y2hlZChcbiAgZW50cmllczogcmVhZG9ubHkgQ2hhbm5lbEVudHJ5W10sXG4gIGFsbG93bGlzdDogUmV0dXJuVHlwZTx0eXBlb2YgZ2V0RWZmZWN0aXZlQ2hhbm5lbEFsbG93bGlzdD4sXG4pOiBVbm1hdGNoZWRbXSB7XG4gIC8vIFNlcnZlci1raW5kOiBidWlsZCBvbmUgU2V0IGZyb20gYWxsIHNjb3BlcyB1cCBmcm9udC4gZ2V0TWNwQ29uZmlnc0J5U2NvcGVcbiAgLy8gaXMgbm90IGNhY2hlZCAocHJvamVjdCBzY29wZSB3YWxrcyB0aGUgZGlyIHRyZWUpOyBnZXRNY3BDb25maWdCeU5hbWUgd291bGRcbiAgLy8gcmVkbyB0aGF0IHdhbGsgcGVyIGVudHJ5LlxuICBjb25zdCBzY29wZXMgPSBbJ2VudGVycHJpc2UnLCAndXNlcicsICdwcm9qZWN0JywgJ2xvY2FsJ10gYXMgY29uc3RcbiAgY29uc3QgY29uZmlndXJlZCA9IG5ldyBTZXQ8c3RyaW5nPigpXG4gIGZvciAoY29uc3Qgc2NvcGUgb2Ygc2NvcGVzKSB7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKGdldE1jcENvbmZpZ3NCeVNjb3BlKHNjb3BlKS5zZXJ2ZXJzKSkge1xuICAgICAgY29uZmlndXJlZC5hZGQobmFtZSlcbiAgICB9XG4gIH1cblxuICAvLyBQbHVnaW4ta2luZCBpbnN0YWxsZWQgY2hlY2s6IGluc3RhbGxlZF9wbHVnaW5zLmpzb24ga2V5cyBhcmVcbiAgLy8gYG5hbWVAbWFya2V0cGxhY2VgLiBsb2FkSW5zdGFsbGVkUGx1Z2luc1YyIGlzIGNhY2hlZC5cbiAgY29uc3QgaW5zdGFsbGVkUGx1Z2luSWRzID0gbmV3IFNldChcbiAgICBPYmplY3Qua2V5cyhsb2FkSW5zdGFsbGVkUGx1Z2luc1YyKCkucGx1Z2lucyksXG4gIClcblxuICAvLyBQbHVnaW4ta2luZCBhbGxvd2xpc3QgY2hlY2s6IHNhbWUge21hcmtldHBsYWNlLCBwbHVnaW59IHRlc3QgYXMgdGhlXG4gIC8vIGdhdGUgYXQgY2hhbm5lbE5vdGlmaWNhdGlvbi50cy4gZW50cnkuZGV2IGJ5cGFzc2VzIChkZXYgZmxhZyBvcHRzIG91dFxuICAvLyBvZiB0aGUgYWxsb3dsaXN0KS4gT3JnIGxpc3QgcmVwbGFjZXMgbGVkZ2VyIHdoZW4gc2V0ICh0ZWFtL2VudGVycHJpc2UpLlxuICAvLyBHcm93dGhCb29rIF9DQUNIRURfTUFZX0JFX1NUQUxFIOKAlCBjb2xkIGNhY2hlIHlpZWxkcyBbXSBzbyBldmVyeSBwbHVnaW5cbiAgLy8gZW50cnkgd2FybnM7IHNhbWUgdHJhZGVvZmYgdGhlIGdhdGUgYWxyZWFkeSBhY2NlcHRzLlxuICBjb25zdCB7IGVudHJpZXM6IGFsbG93ZWQsIHNvdXJjZSB9ID0gYWxsb3dsaXN0XG5cbiAgLy8gSW5kZXBlbmRlbnQgaWZzIOKAlCBhIHBsdWdpbiBlbnRyeSB0aGF0J3MgYm90aCB1bmluc3RhbGxlZCBBTkRcbiAgLy8gdW5saXN0ZWQgc2hvd3MgdHdvIGxpbmVzLiBTZXJ2ZXIga2luZCBjaGVja3MgY29uZmlnICsgZGV2IGZsYWcuXG4gIGNvbnN0IG91dDogVW5tYXRjaGVkW10gPSBbXVxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBpZiAoZW50cnkua2luZCA9PT0gJ3NlcnZlcicpIHtcbiAgICAgIGlmICghY29uZmlndXJlZC5oYXMoZW50cnkubmFtZSkpIHtcbiAgICAgICAgb3V0LnB1c2goeyBlbnRyeSwgd2h5OiAnbm8gTUNQIHNlcnZlciBjb25maWd1cmVkIHdpdGggdGhhdCBuYW1lJyB9KVxuICAgICAgfVxuICAgICAgaWYgKCFlbnRyeS5kZXYpIHtcbiAgICAgICAgb3V0LnB1c2goe1xuICAgICAgICAgIGVudHJ5LFxuICAgICAgICAgIHdoeTogJ3NlcnZlcjogZW50cmllcyBuZWVkIC0tZGFuZ2Vyb3VzbHktbG9hZC1kZXZlbG9wbWVudC1jaGFubmVscycsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpZiAoIWluc3RhbGxlZFBsdWdpbklkcy5oYXMoYCR7ZW50cnkubmFtZX1AJHtlbnRyeS5tYXJrZXRwbGFjZX1gKSkge1xuICAgICAgb3V0LnB1c2goeyBlbnRyeSwgd2h5OiAncGx1Z2luIG5vdCBpbnN0YWxsZWQnIH0pXG4gICAgfVxuICAgIGlmIChcbiAgICAgICFlbnRyeS5kZXYgJiZcbiAgICAgICFhbGxvd2VkLnNvbWUoXG4gICAgICAgIGUgPT4gZS5wbHVnaW4gPT09IGVudHJ5Lm5hbWUgJiYgZS5tYXJrZXRwbGFjZSA9PT0gZW50cnkubWFya2V0cGxhY2UsXG4gICAgICApXG4gICAgKSB7XG4gICAgICBvdXQucHVzaCh7XG4gICAgICAgIGVudHJ5LFxuICAgICAgICB3aHk6XG4gICAgICAgICAgc291cmNlID09PSAnb3JnJ1xuICAgICAgICAgICAgPyBcIm5vdCBvbiB5b3VyIG9yZydzIGFwcHJvdmVkIGNoYW5uZWxzIGxpc3RcIlxuICAgICAgICAgICAgOiAnbm90IG9uIHRoZSBhcHByb3ZlZCBjaGFubmVscyBhbGxvd2xpc3QnLFxuICAgICAgfSlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dFxufVxuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxPQUFPLEtBQUtBLEtBQUssTUFBTSxPQUFPO0FBQzlCLFNBQVNDLFFBQVEsUUFBUSxPQUFPO0FBQ2hDLFNBQ0UsS0FBS0MsWUFBWSxFQUNqQkMsa0JBQWtCLEVBQ2xCQyxpQkFBaUIsUUFDWiwwQkFBMEI7QUFDakMsU0FBU0MsR0FBRyxFQUFFQyxJQUFJLFFBQVEsY0FBYztBQUN4QyxTQUFTQyxpQkFBaUIsUUFBUSx3Q0FBd0M7QUFDMUUsU0FBU0MsNEJBQTRCLFFBQVEsMkNBQTJDO0FBQ3hGLFNBQVNDLG9CQUFvQixRQUFRLDhCQUE4QjtBQUNuRSxTQUNFQyxzQkFBc0IsRUFDdEJDLG1CQUFtQixRQUNkLHFCQUFxQjtBQUM1QixTQUFTQyxzQkFBc0IsUUFBUSxnREFBZ0Q7QUFDdkYsU0FBU0Msb0JBQW9CLFFBQVEsa0NBQWtDO0FBRXZFLE9BQU8sU0FBQUMsZUFBQTtFQUFBLE1BQUFDLENBQUEsR0FBQUMsRUFBQTtFQU9MLE9BQUFDLEVBQUEsSUFDRWhCLFFBQVEsQ0FBQ2lCLEtBMkJSLENBQUM7RUE1Qkc7SUFBQUMsUUFBQTtJQUFBQyxRQUFBO0lBQUFDLE1BQUE7SUFBQUMsYUFBQTtJQUFBQyxJQUFBO0lBQUFDO0VBQUEsSUFBQVAsRUFBOEQ7RUE2QnJFLElBQUlFLFFBQVEsQ0FBQU0sTUFBTyxLQUFLLENBQUM7SUFBQSxPQUFTLElBQUk7RUFBQTtFQUl0QyxN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
 
 
1
  // Conditionally require()'d in LogoV2.tsx behind feature('KAIROS') ||
2
  // feature('KAIROS_CHANNELS'). No feature() guard here β€” the whole file
3
  // tree-shakes via the require pattern when both flags are false (see
4
  // docs/feature-gating.md). Do NOT import this module statically from
5
  // unguarded code.
6
 
7
+ import * as React from 'react'
8
+ import { useState } from 'react'
9
+ import {
10
+ type ChannelEntry,
11
+ getAllowedChannels,
12
+ getHasDevChannels,
13
+ } from '../../bootstrap/state.js'
14
+ import { Box, Text } from '../../ink.js'
15
+ import { isChannelsEnabled } from '../../services/mcp/channelAllowlist.js'
16
+ import { getEffectiveChannelAllowlist } from '../../services/mcp/channelNotification.js'
17
+ import { getMcpConfigsByScope } from '../../services/mcp/config.js'
18
+ import {
19
+ getClaudeAIOAuthTokens,
20
+ getSubscriptionType,
21
+ } from '../../utils/auth.js'
22
+ import { loadInstalledPluginsV2 } from '../../utils/plugins/installedPluginsManager.js'
23
+ import { getSettingsForSource } from '../../utils/settings/settings.js'
24
+
25
+ export function ChannelsNotice(): React.ReactNode {
26
+ // Snapshot all reads at mount. This notice enters scrollback immediately
27
+ // after the logo; any re-render past that point forces a full terminal
28
+ // reset. getAllowedChannels (bootstrap state), getSettingsForSource
29
+ // (session cache updated by background polling / /login), and
30
+ // isChannelsEnabled (GrowthBook 5-min refresh) must be captured once
31
+ // so a later re-render cannot flip branches.
32
+ const [{ channels, disabled, noAuth, policyBlocked, list, unmatched }] =
33
+ useState(() => {
34
+ const ch = getAllowedChannels()
35
+ if (ch.length === 0)
36
+ return {
37
+ channels: ch,
38
+ disabled: false,
39
+ noAuth: false,
40
+ policyBlocked: false,
41
+ list: '',
42
+ unmatched: [] as Unmatched[],
43
+ }
44
+ const l = ch.map(formatEntry).join(', ')
45
+ const sub = getSubscriptionType()
46
+ const managed = sub === 'team' || sub === 'enterprise'
47
+ const policy = getSettingsForSource('policySettings')
48
+ const allowlist = getEffectiveChannelAllowlist(
49
+ sub,
50
+ policy?.allowedChannelPlugins,
51
+ )
52
+ return {
53
+ channels: ch,
54
+ disabled: !isChannelsEnabled(),
55
+ noAuth: !getClaudeAIOAuthTokens()?.accessToken,
56
+ policyBlocked: managed && policy?.channelsEnabled !== true,
57
+ list: l,
58
+ unmatched: findUnmatched(ch, allowlist),
59
+ }
60
+ })
61
+ if (channels.length === 0) return null
62
+
63
+ // When both flags are passed, the list mixes entries and a single flag
64
+ // name would be wrong for half of it. entry.dev distinguishes origin.
65
+ const hasNonDev = channels.some(c => !c.dev)
66
+ const flag =
67
+ getHasDevChannels() && hasNonDev
68
+ ? 'Channels'
69
+ : getHasDevChannels()
70
+ ? '--dangerously-load-development-channels'
71
+ : '--channels'
72
+
73
  if (disabled) {
74
+ return (
75
+ <Box paddingLeft={2} flexDirection="column">
76
+ <Text color="error">
77
+ {flag} ignored ({list})
78
+ </Text>
79
+ <Text dimColor>Channels are not currently available</Text>
80
+ </Box>
81
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
82
  }
83
+
84
  if (noAuth) {
85
+ return (
86
+ <Box paddingLeft={2} flexDirection="column">
87
+ <Text color="error">
88
+ {flag} ignored ({list})
89
+ </Text>
90
+ <Text dimColor>
91
+ Channels require claude.ai authentication Β· run /login, then restart
92
+ </Text>
93
+ </Box>
94
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
95
  }
96
+
97
  if (policyBlocked) {
98
+ return (
99
+ <Box paddingLeft={2} flexDirection="column">
100
+ <Text color="error">
101
+ {flag} blocked by org policy ({list})
102
+ </Text>
103
+ <Text dimColor>Inbound messages will be silently dropped</Text>
104
+ <Text dimColor>
105
+ Have an administrator set channelsEnabled: true in managed settings to
106
+ enable
107
+ </Text>
108
+ {unmatched.map(u => (
109
+ <Text key={`${formatEntry(u.entry)}:${u.why}`} color="warning">
110
+ {formatEntry(u.entry)} Β· {u.why}
111
+ </Text>
112
+ ))}
113
+ </Box>
114
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
115
  }
116
+
117
+ // "Listening for" not "active" β€” at this point we only know the allowlist
118
+ // was set. Server connection, capability declaration, and whether the name
119
+ // even matches a configured MCP server are all still unknown.
120
+ return (
121
+ <Box paddingLeft={2} flexDirection="column">
122
+ <Text color="error">Listening for channel messages from: {list}</Text>
123
+ <Text dimColor>
124
+ Experimental Β· inbound messages will be pushed into this session, this
125
+ carries prompt injection risks. Restart Claude Code without {flag} to
126
+ disable.
127
+ </Text>
128
+ {unmatched.map(u => (
129
+ <Text key={`${formatEntry(u.entry)}:${u.why}`} color="warning">
130
+ {formatEntry(u.entry)} Β· {u.why}
131
+ </Text>
132
+ ))}
133
+ </Box>
134
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
135
  }
136
+
137
  function formatEntry(c: ChannelEntry): string {
138
+ return c.kind === 'plugin'
139
+ ? `plugin:${c.name}@${c.marketplace}`
140
+ : `server:${c.name}`
141
  }
142
+
143
+ type Unmatched = { entry: ChannelEntry; why: string }
144
+
145
+ function findUnmatched(
146
+ entries: readonly ChannelEntry[],
147
+ allowlist: ReturnType<typeof getEffectiveChannelAllowlist>,
148
+ ): Unmatched[] {
149
  // Server-kind: build one Set from all scopes up front. getMcpConfigsByScope
150
  // is not cached (project scope walks the dir tree); getMcpConfigByName would
151
  // redo that walk per entry.
152
+ const scopes = ['enterprise', 'user', 'project', 'local'] as const
153
+ const configured = new Set<string>()
154
  for (const scope of scopes) {
155
  for (const name of Object.keys(getMcpConfigsByScope(scope).servers)) {
156
+ configured.add(name)
157
  }
158
  }
159
 
160
  // Plugin-kind installed check: installed_plugins.json keys are
161
  // `name@marketplace`. loadInstalledPluginsV2 is cached.
162
+ const installedPluginIds = new Set(
163
+ Object.keys(loadInstalledPluginsV2().plugins),
164
+ )
165
 
166
  // Plugin-kind allowlist check: same {marketplace, plugin} test as the
167
  // gate at channelNotification.ts. entry.dev bypasses (dev flag opts out
168
  // of the allowlist). Org list replaces ledger when set (team/enterprise).
169
  // GrowthBook _CACHED_MAY_BE_STALE β€” cold cache yields [] so every plugin
170
  // entry warns; same tradeoff the gate already accepts.
171
+ const { entries: allowed, source } = allowlist
 
 
 
172
 
173
  // Independent ifs β€” a plugin entry that's both uninstalled AND
174
  // unlisted shows two lines. Server kind checks config + dev flag.
175
+ const out: Unmatched[] = []
176
  for (const entry of entries) {
177
  if (entry.kind === 'server') {
178
  if (!configured.has(entry.name)) {
179
+ out.push({ entry, why: 'no MCP server configured with that name' })
 
 
 
180
  }
181
  if (!entry.dev) {
182
  out.push({
183
  entry,
184
+ why: 'server: entries need --dangerously-load-development-channels',
185
+ })
186
  }
187
+ continue
188
  }
189
  if (!installedPluginIds.has(`${entry.name}@${entry.marketplace}`)) {
190
+ out.push({ entry, why: 'plugin not installed' })
 
 
 
191
  }
192
+ if (
193
+ !entry.dev &&
194
+ !allowed.some(
195
+ e => e.plugin === entry.name && e.marketplace === entry.marketplace,
196
+ )
197
+ ) {
198
  out.push({
199
  entry,
200
+ why:
201
+ source === 'org'
202
+ ? "not on your org's approved channels list"
203
+ : 'not on the approved channels allowlist',
204
+ })
205
  }
206
  }
207
+ return out
208
  }
 
src/components/LogoV2/Clawd.tsx CHANGED
@@ -1,14 +1,16 @@
1
- import { c as _c } from "react/compiler-runtime";
2
- import * as React from 'react';
3
- import { Box, Text } from '../../ink.js';
4
- import { env } from '../../utils/env.js';
5
- export type ClawdPose = 'default' | 'arms-up' // both arms raised (used during jump)
 
 
6
  | 'look-left' // both pupils shifted left
7
- | 'look-right'; // both pupils shifted right
8
 
9
  type Props = {
10
- pose?: ClawdPose;
11
- };
12
 
13
  // Standard-terminal pose fragments. Each row is split into segments so we can
14
  // vary only the parts that change (eyes, arms) while keeping the body/bg spans
@@ -21,46 +23,23 @@ type Props = {
21
  // default (β–›/β–œ, bottom pupils) β€” otherwise only one eye would appear to move.
22
  type Segments = {
23
  /** row 1 left (no bg): optional raised arm + side */
24
- r1L: string;
25
  /** row 1 eyes (with bg): left-eye, forehead, right-eye */
26
- r1E: string;
27
  /** row 1 right (no bg): side + optional raised arm */
28
- r1R: string;
29
  /** row 2 left (no bg): arm + body curve */
30
- r2L: string;
31
  /** row 2 right (no bg): body curve + arm */
32
- r2R: string;
33
- };
 
34
  const POSES: Record<ClawdPose, Segments> = {
35
- default: {
36
- r1L: ' ▐',
37
- r1E: 'β–›β–ˆβ–ˆβ–ˆβ–œ',
38
- r1R: 'β–Œ',
39
- r2L: 'β–β–œ',
40
- r2R: 'β–›β–˜'
41
- },
42
- 'look-left': {
43
- r1L: ' ▐',
44
- r1E: 'β–Ÿβ–ˆβ–ˆβ–ˆβ–Ÿ',
45
- r1R: 'β–Œ',
46
- r2L: 'β–β–œ',
47
- r2R: 'β–›β–˜'
48
- },
49
- 'look-right': {
50
- r1L: ' ▐',
51
- r1E: 'β–™β–ˆβ–ˆβ–ˆβ–™',
52
- r1R: 'β–Œ',
53
- r2L: 'β–β–œ',
54
- r2R: 'β–›β–˜'
55
- },
56
- 'arms-up': {
57
- r1L: 'β–—β–Ÿ',
58
- r1E: 'β–›β–ˆβ–ˆβ–ˆβ–œ',
59
- r1R: 'β–™β––',
60
- r2L: ' β–œ',
61
- r2R: 'β–› '
62
- }
63
- };
64
 
65
  // Apple Terminal uses a bg-fill trick (see below), so only eye poses make
66
  // sense. Arm poses fall back to default.
@@ -68,173 +47,52 @@ const APPLE_EYES: Record<ClawdPose, string> = {
68
  default: ' β–— β–– ',
69
  'look-left': ' β–˜ β–˜ ',
70
  'look-right': ' ▝ ▝ ',
71
- 'arms-up': ' β–— β–– '
72
- };
73
- export function Clawd(t0) {
74
- const $ = _c(26);
75
- let t1;
76
- if ($[0] !== t0) {
77
- t1 = t0 === undefined ? {} : t0;
78
- $[0] = t0;
79
- $[1] = t1;
80
- } else {
81
- t1 = $[1];
82
- }
83
- const {
84
- pose: t2
85
- } = t1;
86
- const pose = t2 === undefined ? "default" : t2;
87
- if (env.terminal === "Apple_Terminal") {
88
- let t3;
89
- if ($[2] !== pose) {
90
- t3 = <AppleTerminalClawd pose={pose} />;
91
- $[2] = pose;
92
- $[3] = t3;
93
- } else {
94
- t3 = $[3];
95
- }
96
- return t3;
97
- }
98
- const p = POSES[pose];
99
- let t3;
100
- if ($[4] !== p.r1L) {
101
- t3 = <Text color="clawd_body">{p.r1L}</Text>;
102
- $[4] = p.r1L;
103
- $[5] = t3;
104
- } else {
105
- t3 = $[5];
106
- }
107
- let t4;
108
- if ($[6] !== p.r1E) {
109
- t4 = <Text color="clawd_body" backgroundColor="clawd_background">{p.r1E}</Text>;
110
- $[6] = p.r1E;
111
- $[7] = t4;
112
- } else {
113
- t4 = $[7];
114
- }
115
- let t5;
116
- if ($[8] !== p.r1R) {
117
- t5 = <Text color="clawd_body">{p.r1R}</Text>;
118
- $[8] = p.r1R;
119
- $[9] = t5;
120
- } else {
121
- t5 = $[9];
122
- }
123
- let t6;
124
- if ($[10] !== t3 || $[11] !== t4 || $[12] !== t5) {
125
- t6 = <Text>{t3}{t4}{t5}</Text>;
126
- $[10] = t3;
127
- $[11] = t4;
128
- $[12] = t5;
129
- $[13] = t6;
130
- } else {
131
- t6 = $[13];
132
- }
133
- let t7;
134
- if ($[14] !== p.r2L) {
135
- t7 = <Text color="clawd_body">{p.r2L}</Text>;
136
- $[14] = p.r2L;
137
- $[15] = t7;
138
- } else {
139
- t7 = $[15];
140
- }
141
- let t8;
142
- if ($[16] === Symbol.for("react.memo_cache_sentinel")) {
143
- t8 = <Text color="clawd_body" backgroundColor="clawd_background">β–ˆβ–ˆβ–ˆβ–ˆβ–ˆ</Text>;
144
- $[16] = t8;
145
- } else {
146
- t8 = $[16];
147
- }
148
- let t9;
149
- if ($[17] !== p.r2R) {
150
- t9 = <Text color="clawd_body">{p.r2R}</Text>;
151
- $[17] = p.r2R;
152
- $[18] = t9;
153
- } else {
154
- t9 = $[18];
155
- }
156
- let t10;
157
- if ($[19] !== t7 || $[20] !== t9) {
158
- t10 = <Text>{t7}{t8}{t9}</Text>;
159
- $[19] = t7;
160
- $[20] = t9;
161
- $[21] = t10;
162
- } else {
163
- t10 = $[21];
164
- }
165
- let t11;
166
- if ($[22] === Symbol.for("react.memo_cache_sentinel")) {
167
- t11 = <Text color="clawd_body">{" "}β–˜β–˜ ▝▝{" "}</Text>;
168
- $[22] = t11;
169
- } else {
170
- t11 = $[22];
171
- }
172
- let t12;
173
- if ($[23] !== t10 || $[24] !== t6) {
174
- t12 = <Box flexDirection="column">{t6}{t10}{t11}</Box>;
175
- $[23] = t10;
176
- $[24] = t6;
177
- $[25] = t12;
178
- } else {
179
- t12 = $[25];
180
- }
181
- return t12;
182
  }
183
- function AppleTerminalClawd(t0) {
184
- const $ = _c(10);
185
- const {
186
- pose
187
- } = t0;
188
- let t1;
189
- if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
190
- t1 = <Text color="clawd_body">β–—</Text>;
191
- $[0] = t1;
192
- } else {
193
- t1 = $[0];
194
- }
195
- const t2 = APPLE_EYES[pose];
196
- let t3;
197
- if ($[1] !== t2) {
198
- t3 = <Text color="clawd_background" backgroundColor="clawd_body">{t2}</Text>;
199
- $[1] = t2;
200
- $[2] = t3;
201
- } else {
202
- t3 = $[2];
203
- }
204
- let t4;
205
- if ($[3] === Symbol.for("react.memo_cache_sentinel")) {
206
- t4 = <Text color="clawd_body">β––</Text>;
207
- $[3] = t4;
208
- } else {
209
- t4 = $[3];
210
- }
211
- let t5;
212
- if ($[4] !== t3) {
213
- t5 = <Text>{t1}{t3}{t4}</Text>;
214
- $[4] = t3;
215
- $[5] = t5;
216
- } else {
217
- t5 = $[5];
218
- }
219
- let t6;
220
- let t7;
221
- if ($[6] === Symbol.for("react.memo_cache_sentinel")) {
222
- t6 = <Text backgroundColor="clawd_body">{" ".repeat(7)}</Text>;
223
- t7 = <Text color="clawd_body">β–˜β–˜ ▝▝</Text>;
224
- $[6] = t6;
225
- $[7] = t7;
226
- } else {
227
- t6 = $[6];
228
- t7 = $[7];
229
- }
230
- let t8;
231
- if ($[8] !== t5) {
232
- t8 = <Box flexDirection="column" alignItems="center">{t5}{t6}{t7}</Box>;
233
- $[8] = t5;
234
- $[9] = t8;
235
- } else {
236
- t8 = $[9];
237
- }
238
- return t8;
239
  }
240
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIkJveCIsIlRleHQiLCJlbnYiLCJDbGF3ZFBvc2UiLCJQcm9wcyIsInBvc2UiLCJTZWdtZW50cyIsInIxTCIsInIxRSIsInIxUiIsInIyTCIsInIyUiIsIlBPU0VTIiwiUmVjb3JkIiwiZGVmYXVsdCIsIkFQUExFX0VZRVMiLCJDbGF3ZCIsInQwIiwiJCIsIl9jIiwidDEiLCJ1bmRlZmluZWQiLCJ0MiIsInRlcm1pbmFsIiwidDMiLCJwIiwidDQiLCJ0NSIsInQ2IiwidDciLCJ0OCIsIlN5bWJvbCIsImZvciIsInQ5IiwidDEwIiwidDExIiwidDEyIiwiQXBwbGVUZXJtaW5hbENsYXdkIiwicmVwZWF0Il0sInNvdXJjZXMiOlsiQ2xhd2QudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgQm94LCBUZXh0IH0gZnJvbSAnLi4vLi4vaW5rLmpzJ1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi4vLi4vdXRpbHMvZW52LmpzJ1xuXG5leHBvcnQgdHlwZSBDbGF3ZFBvc2UgPVxuICB8ICdkZWZhdWx0J1xuICB8ICdhcm1zLXVwJyAvLyBib3RoIGFybXMgcmFpc2VkICh1c2VkIGR1cmluZyBqdW1wKVxuICB8ICdsb29rLWxlZnQnIC8vIGJvdGggcHVwaWxzIHNoaWZ0ZWQgbGVmdFxuICB8ICdsb29rLXJpZ2h0JyAvLyBib3RoIHB1cGlscyBzaGlmdGVkIHJpZ2h0XG5cbnR5cGUgUHJvcHMgPSB7XG4gIHBvc2U/OiBDbGF3ZFBvc2Vcbn1cblxuLy8gU3RhbmRhcmQtdGVybWluYWwgcG9zZSBmcmFnbWVudHMuIEVhY2ggcm93IGlzIHNwbGl0IGludG8gc2VnbWVudHMgc28gd2UgY2FuXG4vLyB2YXJ5IG9ubHkgdGhlIHBhcnRzIHRoYXQgY2hhbmdlIChleWVzLCBhcm1zKSB3aGlsZSBrZWVwaW5nIHRoZSBib2R5L2JnIHNwYW5zXG4vLyBzdGFibGUuIEFsbCBwb3NlcyBlbmQgdXAgOSBjb2xzIHdpZGUuXG4vL1xuLy8gYXJtcy11cDogdGhlIHJvdy0yIGFybSBzaGFwZXMgKOKWneKWnCAvIOKWm+KWmCkgbW92ZSB0byByb3cgMSBhcyB0aGVpclxuLy8gYm90dG9tLWhlYXZ5IG1pcnJvcnMgKOKWl+KWnyAvIOKWmeKWlikg4oCUIHNhbWUgc2lsaG91ZXR0ZSwgb25lIHJvdyBoaWdoZXIuXG4vL1xuLy8gbG9vay0qIHVzZSB0b3AtcXVhZHJhbnQgZXllIGNoYXJzICjilpkv4pafKSBzbyBib3RoIGV5ZXMgY2hhbmdlIGZyb20gdGhlXG4vLyBkZWZhdWx0ICjilpsv4pacLCBib3R0b20gcHVwaWxzKSDigJQgb3RoZXJ3aXNlIG9ubHkgb25lIGV5ZSB3b3VsZCBhcHBlYXIgdG8gbW92ZS5cbnR5cGUgU2VnbWVudHMgPSB7XG4gIC8qKiByb3cgMSBsZWZ0IChubyBiZyk6IG9wdGlvbmFsIHJhaXNlZCBhcm0gKyBzaWRlICovXG4gIHIxTDogc3RyaW5nXG4gIC8qKiByb3cgMSBleWVzICh3aXRoIGJnKTogbGVmdC1leWUsIGZvcmVoZWFkLCByaWdodC1leWUgKi9cbiAgcjFFOiBzdHJpbmdcbiAgLyoqIHJvdyAxIHJpZ2h0IChubyBiZyk6IHNpZGUgKyBvcHRpb25hbCByYWlzZWQgYXJtICovXG4gIHIxUjogc3RyaW5nXG4gIC8qKiByb3cgMiBsZWZ0IChubyBiZyk6IGFybSArIGJvZHkgY3VydmUgKi9cbiAgcjJMOiBzdHJpbmdcbiAgLyoqIHJvdyAyIHJpZ2h0IChubyBiZyk6IGJvZHkgY3VydmUgKyBhcm0gKi9cbiAgcjJSOiBzdHJpbmdcbn1cblxuY29uc3QgUE9TRVM6IFJlY29yZDxDbGF3ZFBvc2UsIFNlZ21lbnRzPiA9IHtcbiAgZGVmYXVsdDogeyByMUw6ICcg4paQJywgcjFFOiAn4pab4paI4paI4paI4pacJywgcjFSOiAn4paMJywgcjJMOiAn4pad4pacJywgcjJSOiAn4pab4paYJyB9LFxuICAnbG9vay1sZWZ0JzogeyByMUw6ICcg4paQJywgcjFFOiAn4paf4paI4paI4paI4pafJywgcjFSOiAn4paMJywgcjJMOiAn4pad4pacJywgcjJSOiAn4pab4paYJyB9LFxuICAnbG9vay1yaWdodCc6IHsgcjFMOiAnIOKWkCcsIHIxRTogJ+KWmeKWiOKWiOKWiOKWmScsIHIxUjogJ+KWjCcsIHIyTDogJ+KWneKWnCcsIHIyUjogJ+KWm+KWmCcgfSxcbiAgJ2FybXMtdXAnOiB7IHIxTDogJ+KWl+KWnycsIHIxRTogJ+KWm+KWiOKWiOKWiOKWnCcsIHIxUjogJ+KWmeKWlicsIHIyTDogJyDilpwnLCByMlI6ICfilpsgJyB9LFxufVxuXG4vLyBBcHBsZSBUZXJtaW5hbCB1c2VzIGEgYmctZmlsbCB0cmljayAoc2VlIGJlbG93KSwgc28gb25seSBleWUgcG9zZXMgbWFrZVxuLy8gc2Vuc2UuIEFybSBwb3NlcyBmYWxsIGJhY2sgdG8gZGVmYXVsdC5cbmNvbnN0IEFQUExFX0VZRVM6IFJlY29yZDxDbGF3ZFBvc2UsIHN0cmluZz4gPSB7XG4gIGRlZmF1bHQ6ICcg4paXICAg4paWICcsXG4gICdsb29rLWxlZnQnOiAnIOKWmCAgIOKWmCAnLFxuICAnbG9vay1yaWdodCc6ICcg4padICAg4padICcsXG4gICdhcm1zLXVwJzogJyDilpcgICDilpYgJyxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIENsYXdkKHsgcG9zZSA9ICdkZWZhdWx0JyB9OiBQcm9wcyA9IHt9KTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgaWYgKGVudi50ZXJtaW5hbCA9PT0gJ0FwcGxlX1Rlcm1pbmFsJykge1xuICAgIHJldHVybiA8QXBwbGVUZXJtaW5hbENsYXdkIHBvc2U9e3Bvc2V9IC8+XG4gIH1cbiAgY29uc3QgcCA9IFBPU0VTW3Bvc2VdXG4gIHJldHVybiAoXG4gICAgPEJveCBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCI+XG4gICAgICA8VGV4dD5cbiAgICAgICAgPFRleHQgY29sb3I9XCJjbGF3ZF9ib2R5XCI+e3AucjFMfTwvVGV4dD5cbiAgICAgICAgPFRleHQgY29sb3I9XCJjbGF3ZF9ib2R5XCIgYmFja2dyb3VuZENvbG9yPVwiY2xhd2RfYmFja2dyb3VuZFwiPlxuICAgICAgICAgIHtwLnIxRX1cbiAgICAgICAgPC9UZXh0PlxuICAgICAgICA8VGV4dCBjb2xvcj1cImNsYXdkX2JvZHlcIj57cC5yMVJ9PC9UZXh0PlxuICAgICAgPC9UZXh0PlxuICAgICAgPFRleHQ+XG4gICAgICAgIDxUZXh0IGNvbG9yPVwiY2xhd2RfYm9keVwiPntwLnIyTH08L1RleHQ+XG4gICAgICAgIDxUZXh0IGNvbG9yPVwiY2xhd2RfYm9keVwiIGJhY2tncm91bmRDb2xvcj1cImNsYXdkX2JhY2tncm91bmRcIj5cbiAgICAgICAgICDilojilojilojilojilohcbiAgICAgICAgPC9UZXh0PlxuICAgICAgICA8VGV4dCBjb2xvcj1cImNsYXdkX2JvZHlcIj57cC5yMlJ9PC9UZXh0PlxuICAgICAgPC9UZXh0PlxuICAgICAgPFRleHQgY29sb3I9XCJjbGF3ZF9ib2R5XCI+XG4gICAgICAgIHsnICAnfeKWmOKWmCDilp3ilp17JyAgJ31cbiAgICAgIDwvVGV4dD5cbiAgICA8L0JveD5cbiAgKVxufVxuXG5mdW5jdGlvbiBBcHBsZVRlcm1pbmFsQ2xhd2QoeyBwb3NlIH06IHsgcG9zZTogQ2xhd2RQb3NlIH0pOiBSZWFjdC5SZWFjdE5vZGUge1xuICAvLyBBcHBsZSdzIFRlcm1pbmFsIHJlbmRlcnMgdmVydGljYWwgc3BhY2UgYmV0d2VlbiBjaGFycyBieSBkZWZhdWx0LlxuICAvLyBJdCBkb2VzIE5PVCByZW5kZXIgdmVydGljYWwgc3BhY2UgYmV0d2VlbiBiYWNrZ3JvdW5kIGNvbG9yc1xuICAvLyBzbyB3ZSB1c2UgYmFja2dyb3VuZCBjb2xvciB0byBkcmF3IHRoZSBtYWluIHNoYXBlLlxuICByZXR1cm4gKFxuICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiIGFsaWduSXRlbXM9XCJjZW50ZXJcIj5cbiAgICAgIDxUZXh0PlxuICAgICAgICA8VGV4dCBjb2xvcj1cImNsYXdkX2JvZHlcIj7ilpc8L1RleHQ+XG4gICAgICAgIDxUZXh0IGNvbG9yPVwiY2xhd2RfYmFja2dyb3VuZFwiIGJhY2tncm91bmRDb2xvcj1cImNsYXdkX2JvZHlcIj5cbiAgICAgICAgICB7QVBQTEVfRVlFU1twb3NlXX1cbiAgICAgICAgPC9UZXh0PlxuICAgICAgICA8VGV4dCBjb2xvcj1cImNsYXdkX2JvZHlcIj7ilpY8L1RleHQ+XG4gICAgICA8L1RleHQ+XG4gICAgICA8VGV4dCBiYWNrZ3JvdW5kQ29sb3I9XCJjbGF3ZF9ib2R5XCI+eycgJy5yZXBlYXQoNyl9PC9UZXh0PlxuICAgICAgPFRleHQgY29sb3I9XCJjbGF3ZF9ib2R5XCI+4paY4paYIOKWneKWnTwvVGV4dD5cbiAgICA8L0JveD5cbiAgKVxufVxuIl0sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxLQUFLQSxLQUFLLE1BQU0sT0FBTztBQUM5QixTQUFTQyxHQUFHLEVBQUVDLElBQUksUUFBUSxjQUFjO0FBQ3hDLFNBQVNDLEdBQUcsUUFBUSxvQkFBb0I7QUFFeEMsT0FBTyxLQUFLQyxTQUFTLEdBQ2pCLFNBQVMsR0FDVCxTQUFTLENBQUM7QUFBQSxFQUNWLFdBQVcsQ0FBQztBQUFBLEVBQ1osWUFBWSxFQUFDOztBQUVqQixLQUFLQyxLQUFLLEdBQUc7RUFDWEMsSUFBSSxDQUFDLEVBQUVGLFNBQVM7QUFDbEIsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLRyxRQUFRLEdBQUc7RUFDZDtFQUNBQyxHQUFHLEVBQUUsTUFBTTtFQUNYO0VBQ0FDLEdBQUcsRUFBRSxNQUFNO0VBQ1g7RUFDQUMsR0FBRyxFQUFFLE1BQU07RUFDWDtFQUNBQyxHQUFHLEVBQUUsTUFBTTtFQUNYO0VBQ0FDLEdBQUcsRUFBRSxNQUFNO0FBQ2IsQ0FBQztBQUVELE1BQU1DLEtBQUssRUFBRUMsTUFBTSxDQUFDVixTQUFTLEVBQUVHLFFBQVEsQ0FBQyxHQUFHO0VBQ3pDUSxPQUFPLEVBQUU7SUFBRVAsR0FBRyxFQUFFLElBQUk7SUFBRUMsR0FBRyxFQUFFLE9BQU87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
 
1
+ import * as React from 'react'
2
+ import { Box, Text } from '../../ink.js'
3
+ import { env } from '../../utils/env.js'
4
+
5
+ export type ClawdPose =
6
+ | 'default'
7
+ | 'arms-up' // both arms raised (used during jump)
8
  | 'look-left' // both pupils shifted left
9
+ | 'look-right' // both pupils shifted right
10
 
11
  type Props = {
12
+ pose?: ClawdPose
13
+ }
14
 
15
  // Standard-terminal pose fragments. Each row is split into segments so we can
16
  // vary only the parts that change (eyes, arms) while keeping the body/bg spans
 
23
  // default (β–›/β–œ, bottom pupils) β€” otherwise only one eye would appear to move.
24
  type Segments = {
25
  /** row 1 left (no bg): optional raised arm + side */
26
+ r1L: string
27
  /** row 1 eyes (with bg): left-eye, forehead, right-eye */
28
+ r1E: string
29
  /** row 1 right (no bg): side + optional raised arm */
30
+ r1R: string
31
  /** row 2 left (no bg): arm + body curve */
32
+ r2L: string
33
  /** row 2 right (no bg): body curve + arm */
34
+ r2R: string
35
+ }
36
+
37
  const POSES: Record<ClawdPose, Segments> = {
38
+ default: { r1L: ' ▐', r1E: 'β–›β–ˆβ–ˆβ–ˆβ–œ', r1R: 'β–Œ', r2L: 'β–β–œ', r2R: 'β–›β–˜' },
39
+ 'look-left': { r1L: ' ▐', r1E: 'β–Ÿβ–ˆβ–ˆβ–ˆβ–Ÿ', r1R: 'β–Œ', r2L: 'β–β–œ', r2R: 'β–›β–˜' },
40
+ 'look-right': { r1L: ' ▐', r1E: 'β–™β–ˆβ–ˆβ–ˆβ–™', r1R: 'β–Œ', r2L: 'β–β–œ', r2R: 'β–›β–˜' },
41
+ 'arms-up': { r1L: 'β–—β–Ÿ', r1E: 'β–›β–ˆβ–ˆβ–ˆβ–œ', r1R: 'β–™β––', r2L: ' β–œ', r2R: 'β–› ' },
42
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43
 
44
  // Apple Terminal uses a bg-fill trick (see below), so only eye poses make
45
  // sense. Arm poses fall back to default.
 
47
  default: ' β–— β–– ',
48
  'look-left': ' β–˜ β–˜ ',
49
  'look-right': ' ▝ ▝ ',
50
+ 'arms-up': ' β–— β–– ',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
51
  }
52
+
53
+ export function Clawd({ pose = 'default' }: Props = {}): React.ReactNode {
54
+ if (env.terminal === 'Apple_Terminal') {
55
+ return <AppleTerminalClawd pose={pose} />
56
+ }
57
+ const p = POSES[pose]
58
+ return (
59
+ <Box flexDirection="column">
60
+ <Text>
61
+ <Text color="clawd_body">{p.r1L}</Text>
62
+ <Text color="clawd_body" backgroundColor="clawd_background">
63
+ {p.r1E}
64
+ </Text>
65
+ <Text color="clawd_body">{p.r1R}</Text>
66
+ </Text>
67
+ <Text>
68
+ <Text color="clawd_body">{p.r2L}</Text>
69
+ <Text color="clawd_body" backgroundColor="clawd_background">
70
+ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆ
71
+ </Text>
72
+ <Text color="clawd_body">{p.r2R}</Text>
73
+ </Text>
74
+ <Text color="clawd_body">
75
+ {' '}β–˜β–˜ ▝▝{' '}
76
+ </Text>
77
+ </Box>
78
+ )
79
+ }
80
+
81
+ function AppleTerminalClawd({ pose }: { pose: ClawdPose }): React.ReactNode {
82
+ // Apple's Terminal renders vertical space between chars by default.
83
+ // It does NOT render vertical space between background colors
84
+ // so we use background color to draw the main shape.
85
+ return (
86
+ <Box flexDirection="column" alignItems="center">
87
+ <Text>
88
+ <Text color="clawd_body">β–—</Text>
89
+ <Text color="clawd_background" backgroundColor="clawd_body">
90
+ {APPLE_EYES[pose]}
91
+ </Text>
92
+ <Text color="clawd_body">β––</Text>
93
+ </Text>
94
+ <Text backgroundColor="clawd_body">{' '.repeat(7)}</Text>
95
+ <Text color="clawd_body">β–˜β–˜ ▝▝</Text>
96
+ </Box>
97
+ )
 
 
 
 
 
 
 
 
 
 
98
  }
 
src/components/LogoV2/CondensedLogo.tsx CHANGED
@@ -1,161 +1,119 @@
1
- import { c as _c } from "react/compiler-runtime";
2
- import * as React from 'react';
3
- import { type ReactNode, useEffect } from 'react';
4
- import { useMainLoopModel } from '../../hooks/useMainLoopModel.js';
5
- import { useTerminalSize } from '../../hooks/useTerminalSize.js';
6
- import { stringWidth } from '../../ink/stringWidth.js';
7
- import { Box, Text } from '../../ink.js';
8
- import { useAppState } from '../../state/AppState.js';
9
- import { getEffortSuffix } from '../../utils/effort.js';
10
- import { truncate } from '../../utils/format.js';
11
- import { isFullscreenEnvEnabled } from '../../utils/fullscreen.js';
12
- import { formatModelAndBilling, getLogoDisplayData, truncatePath } from '../../utils/logoV2Utils.js';
13
- import { renderModelSetting } from '../../utils/model/model.js';
14
- import { OffscreenFreeze } from '../OffscreenFreeze.js';
15
- import { AnimatedClawd } from './AnimatedClawd.js';
16
- import { Clawd } from './Clawd.js';
17
- import { GuestPassesUpsell, incrementGuestPassesSeenCount, useShowGuestPassesUpsell } from './GuestPassesUpsell.js';
18
- import { incrementOverageCreditUpsellSeenCount, OverageCreditUpsell, useShowOverageCreditUpsell } from './OverageCreditUpsell.js';
19
- export function CondensedLogo() {
20
- const $ = _c(29);
21
- const {
22
- columns
23
- } = useTerminalSize();
24
- const agent = useAppState(_temp);
25
- const effortValue = useAppState(_temp2);
26
- const model = useMainLoopModel();
27
- const modelDisplayName = renderModelSetting(model);
28
- const {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
  version,
30
- cwd,
31
- billingType,
32
- agentName: agentNameFromSettings
33
- } = getLogoDisplayData();
34
- const agentName = agent ?? agentNameFromSettings;
35
- const showGuestPassesUpsell = useShowGuestPassesUpsell();
36
- const showOverageCreditUpsell = useShowOverageCreditUpsell();
37
- let t0;
38
- let t1;
39
- if ($[0] !== showGuestPassesUpsell) {
40
- t0 = () => {
41
- if (showGuestPassesUpsell) {
42
- incrementGuestPassesSeenCount();
43
- }
44
- };
45
- t1 = [showGuestPassesUpsell];
46
- $[0] = showGuestPassesUpsell;
47
- $[1] = t0;
48
- $[2] = t1;
49
- } else {
50
- t0 = $[1];
51
- t1 = $[2];
52
- }
53
- useEffect(t0, t1);
54
- let t2;
55
- let t3;
56
- if ($[3] !== showGuestPassesUpsell || $[4] !== showOverageCreditUpsell) {
57
- t2 = () => {
58
- if (showOverageCreditUpsell && !showGuestPassesUpsell) {
59
- incrementOverageCreditUpsellSeenCount();
60
- }
61
- };
62
- t3 = [showOverageCreditUpsell, showGuestPassesUpsell];
63
- $[3] = showGuestPassesUpsell;
64
- $[4] = showOverageCreditUpsell;
65
- $[5] = t2;
66
- $[6] = t3;
67
- } else {
68
- t2 = $[5];
69
- t3 = $[6];
70
- }
71
- useEffect(t2, t3);
72
- const textWidth = Math.max(columns - 15, 20);
73
- const truncatedVersion = truncate(version, Math.max(textWidth - 13, 6));
74
- const effortSuffix = getEffortSuffix(model, effortValue);
75
- const {
76
- shouldSplit,
77
- truncatedModel,
78
- truncatedBilling
79
- } = formatModelAndBilling(modelDisplayName + effortSuffix, billingType, textWidth);
80
- const cwdAvailableWidth = agentName ? textWidth - 1 - stringWidth(agentName) - 3 : textWidth;
81
- const truncatedCwd = truncatePath(cwd, Math.max(cwdAvailableWidth, 10));
82
- let t4;
83
- if ($[7] === Symbol.for("react.memo_cache_sentinel")) {
84
- t4 = isFullscreenEnvEnabled() ? <AnimatedClawd /> : <Clawd />;
85
- $[7] = t4;
86
- } else {
87
- t4 = $[7];
88
- }
89
- let t5;
90
- if ($[8] === Symbol.for("react.memo_cache_sentinel")) {
91
- t5 = <Text bold={true}>VersperClaw</Text>;
92
- $[8] = t5;
93
- } else {
94
- t5 = $[8];
95
- }
96
- let t6;
97
- if ($[9] !== truncatedVersion) {
98
- t6 = <Text>{t5}{" "}<Text dimColor={true}>v{truncatedVersion}</Text></Text>;
99
- $[9] = truncatedVersion;
100
- $[10] = t6;
101
- } else {
102
- t6 = $[10];
103
- }
104
- let t7;
105
- if ($[11] !== shouldSplit || $[12] !== truncatedBilling || $[13] !== truncatedModel) {
106
- t7 = shouldSplit ? <><Text dimColor={true}>{truncatedModel}</Text><Text dimColor={true}>{truncatedBilling}</Text></> : <Text dimColor={true}>{truncatedModel} Β· {truncatedBilling}</Text>;
107
- $[11] = shouldSplit;
108
- $[12] = truncatedBilling;
109
- $[13] = truncatedModel;
110
- $[14] = t7;
111
- } else {
112
- t7 = $[14];
113
- }
114
- const t8 = agentName ? `@${agentName} Β· ${truncatedCwd}` : truncatedCwd;
115
- let t9;
116
- if ($[15] !== t8) {
117
- t9 = <Text dimColor={true}>{t8}</Text>;
118
- $[15] = t8;
119
- $[16] = t9;
120
- } else {
121
- t9 = $[16];
122
- }
123
- let t10;
124
- if ($[17] !== showGuestPassesUpsell) {
125
- t10 = showGuestPassesUpsell && <GuestPassesUpsell />;
126
- $[17] = showGuestPassesUpsell;
127
- $[18] = t10;
128
- } else {
129
- t10 = $[18];
130
- }
131
- let t11;
132
- if ($[19] !== showGuestPassesUpsell || $[20] !== showOverageCreditUpsell || $[21] !== textWidth) {
133
- t11 = !showGuestPassesUpsell && showOverageCreditUpsell && <OverageCreditUpsell maxWidth={textWidth} twoLine={true} />;
134
- $[19] = showGuestPassesUpsell;
135
- $[20] = showOverageCreditUpsell;
136
- $[21] = textWidth;
137
- $[22] = t11;
138
- } else {
139
- t11 = $[22];
140
- }
141
- let t12;
142
- if ($[23] !== t10 || $[24] !== t11 || $[25] !== t6 || $[26] !== t7 || $[27] !== t9) {
143
- t12 = <OffscreenFreeze><Box flexDirection="row" gap={2} alignItems="center">{t4}<Box flexDirection="column">{t6}{t7}{t9}{t10}{t11}</Box></Box></OffscreenFreeze>;
144
- $[23] = t10;
145
- $[24] = t11;
146
- $[25] = t6;
147
- $[26] = t7;
148
- $[27] = t9;
149
- $[28] = t12;
150
- } else {
151
- t12 = $[28];
152
- }
153
- return t12;
154
  }
155
- function _temp2(s_0) {
156
- return s_0.effortValue;
157
- }
158
- function _temp(s) {
159
- return s.agent;
160
- }
161
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIlJlYWN0Tm9kZSIsInVzZUVmZmVjdCIsInVzZU1haW5Mb29wTW9kZWwiLCJ1c2VUZXJtaW5hbFNpemUiLCJzdHJpbmdXaWR0aCIsIkJveCIsIlRleHQiLCJ1c2VBcHBTdGF0ZSIsImdldEVmZm9ydFN1ZmZpeCIsInRydW5jYXRlIiwiaXNGdWxsc2NyZWVuRW52RW5hYmxlZCIsImZvcm1hdE1vZGVsQW5kQmlsbGluZyIsImdldExvZ29EaXNwbGF5RGF0YSIsInRydW5jYXRlUGF0aCIsInJlbmRlck1vZGVsU2V0dGluZyIsIk9mZnNjcmVlbkZyZWV6ZSIsIkFuaW1hdGVkQ2xhd2QiLCJDbGF3ZCIsIkd1ZXN0UGFzc2VzVXBzZWxsIiwiaW5jcmVtZW50R3Vlc3RQYXNzZXNTZWVuQ291bnQiLCJ1c2VTaG93R3Vlc3RQYXNzZXNVcHNlbGwiLCJpbmNyZW1lbnRPdmVyYWdlQ3JlZGl0VXBzZWxsU2VlbkNvdW50IiwiT3ZlcmFnZUNyZWRpdFVwc2VsbCIsInVzZVNob3dPdmVyYWdlQ3JlZGl0VXBzZWxsIiwiQ29uZGVuc2VkTG9nbyIsIiQiLCJfYyIsImNvbHVtbnMiLCJhZ2VudCIsIl90ZW1wIiwiZWZmb3J0VmFsdWUiLCJfdGVtcDIiLCJtb2RlbCIsIm1vZGVsRGlzcGxheU5hbWUiLCJ2ZXJzaW9uIiwiY3dkIiwiYmlsbGluZ1R5cGUiLCJhZ2VudE5hbWUiLCJhZ2VudE5hbWVGcm9tU2V0dGluZ3MiLCJzaG93R3Vlc3RQYXNzZXNVcHNlbGwiLCJzaG93T3ZlcmFnZUNyZWRpdFVwc2VsbCIsInQwIiwidDEiLCJ0MiIsInQzIiwidGV4dFdpZHRoIiwiTWF0aCIsIm1heCIsInRydW5jYXRlZFZlcnNpb24iLCJlZmZvcnRTdWZmaXgiLCJzaG91bGRTcGxpdCIsInRydW5jYXRlZE1vZGVsIiwidHJ1bmNhdGVkQmlsbGluZyIsImN3ZEF2YWlsYWJsZVdpZHRoIiwidHJ1bmNhdGVkQ3dkIiwidDQiLCJTeW1ib2wiLCJmb3IiLCJ0NSIsInQ2IiwidDciLCJ0OCIsInQ5IiwidDEwIiwidDExIiwidDEyIiwic18wIiwicyJdLCJzb3VyY2VzIjpbIkNvbmRlbnNlZExvZ28udHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgdHlwZSBSZWFjdE5vZGUsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgdXNlTWFpbkxvb3BNb2RlbCB9IGZyb20gJy4uLy4uL2hvb2tzL3VzZU1haW5Mb29wTW9kZWwuanMnXG5pbXBvcnQgeyB1c2VUZXJtaW5hbFNpemUgfSBmcm9tICcuLi8uLi9ob29rcy91c2VUZXJtaW5hbFNpemUuanMnXG5pbXBvcnQgeyBzdHJpbmdXaWR0aCB9IGZyb20gJy4uLy4uL2luay9zdHJpbmdXaWR0aC5qcydcbmltcG9ydCB7IEJveCwgVGV4dCB9IGZyb20gJy4uLy4uL2luay5qcydcbmltcG9ydCB7IHVzZUFwcFN0YXRlIH0gZnJvbSAnLi4vLi4vc3RhdGUvQXBwU3RhdGUuanMnXG5pbXBvcnQgeyBnZXRFZmZvcnRTdWZmaXggfSBmcm9tICcuLi8uLi91dGlscy9lZmZvcnQuanMnXG5pbXBvcnQgeyB0cnVuY2F0ZSB9IGZyb20gJy4uLy4uL3V0aWxzL2Zvcm1hdC5qcydcbmltcG9ydCB7IGlzRnVsbHNjcmVlbkVudkVuYWJsZWQgfSBmcm9tICcuLi8uLi91dGlscy9mdWxsc2NyZWVuLmpzJ1xuaW1wb3J0IHtcbiAgZm9ybWF0TW9kZWxBbmRCaWxsaW5nLFxuICBnZXRMb2dvRGlzcGxheURhdGEsXG4gIHRydW5jYXRlUGF0aCxcbn0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nb1YyVXRpbHMuanMnXG5pbXBvcnQgeyByZW5kZXJNb2RlbFNldHRpbmcgfSBmcm9tICcuLi8uLi91dGlscy9tb2RlbC9tb2RlbC5qcydcbmltcG9ydCB7IE9mZnNjcmVlbkZyZWV6ZSB9IGZyb20gJy4uL09mZnNjcmVlbkZyZWV6ZS5qcydcbmltcG9ydCB7IEFuaW1hdGVkQ2xhd2QgfSBmcm9tICcuL0FuaW1hdGVkQ2xhd2QuanMnXG5pbXBvcnQgeyBDbGF3ZCB9IGZyb20gJy4vQ2xhd2QuanMnXG5pbXBvcnQge1xuICBHdWVzdFBhc3Nlc1Vwc2VsbCxcbiAgaW5jcmVtZW50R3Vlc3RQYXNzZXNTZWVuQ291bnQsXG4gIHVzZVNob3dHdWVzdFBhc3Nlc1Vwc2VsbCxcbn0gZnJvbSAnLi9HdWVzdFBhc3Nlc1Vwc2VsbC5qcydcbmltcG9ydCB7XG4gIGluY3JlbWVudE92ZXJhZ2VDcmVkaXRVcHNlbGxTZWVuQ291bnQsXG4gIE92ZXJhZ2VDcmVkaXRVcHNlbGwsXG4gIHVzZVNob3dPdmVyYWdlQ3JlZGl0VXBzZWxsLFxufSBmcm9tICcuL092ZXJhZ2VDcmVkaXRVcHNlbGwuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiBDb25kZW5zZWRMb2dvKCk6IFJlYWN0Tm9kZSB7XG4gIGNvbnN0IHsgY29sdW1ucyB9ID0gdXNlVGVybWluYWxTaXplKClcbiAgY29uc3QgYWdlbnQgPSB1c2VBcHBTdGF0ZShzID0+IHMuYWdlbnQpXG4gIGNvbnN0IGVmZm9ydFZhbHVlID0gdXNlQXBwU3RhdGUocyA9PiBzLmVmZm9ydFZhbHVlKVxuICBjb25zdCBtb2RlbCA9IHVzZU1haW5Mb29wTW9kZWwoKVxuICBjb25zdCBtb2RlbERpc3BsYXlOYW1lID0gcmVuZGVyTW9kZWxTZXR0aW5nKG1vZGVsKVxuICBjb25zdCB7IHZlcnNpb24sIGN3ZCwgYmlsbGluZ1R5cGUsIGFnZW50TmFtZTogYWdlbnROYW1lRnJvbVNldHRpbmdzIH0gPSBnZXRMb2dvRGlzcGxheURhdGEoKVxuXG4gIC8vIFByZWZlciBBcHBTdGF0ZS5hZ2VudCAoc2V0IGZyb20gLS1hZ2VudCBDTEkgZmxhZykgb3ZlciBzZXR0aW5nc1xuICBjb25zdCBhZ2VudE5hbWUgPSBhZ2VudCA/PyBhZ2VudE5hbWVGcm9tU2V0dGluZ3NcbiAgY29uc3Qgc2hvd0d1ZXN0UGFzc2VzVXBzZWxsID0gdXNlU2hvd0d1ZXN0UGFzc2VzVXBzZWxsKClcbiAgY29uc3Qgc2hvd092ZXJhZ2VDcmVkaXRVcHNlbGwgPSB1c2VTaG93T3ZlcmFnZUNyZWRpdFVwc2VsbCgpXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoc2hvd0d1ZXN0UGFzc2VzVXBzZWxsKSB7XG4gICAgICBpbmNyZW1lbnRHdWVzdFBhc3Nlc1NlZW5Db3VudCgpXG4gICAgfVxuICB9LCBbc2hvd0d1ZXN0UGFzc2VzVXBzZWxsXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChzaG93T3ZlcmFnZUNyZWRpdFVwc2VsbCAmJiAhc2hvd0d1ZXN0UGFzc2VzVXBzZWxsKSB7XG4gICAgICBpbmNyZW1lbnRPdmVyYWdlQ3JlZGl0VXBzZWxsU2VlbkNvdW50KClcbiAgICB9XG4gIH0sIFtzaG93T3ZlcmFnZUNyZWRpdFVwc2VsbCwgc2hvd0d1ZXN0UGFzc2VzVXBzZWxsXSlcblxuICAvLyBDYWxjdWxhdGUgYXZhaWxhYmxlIHdpZHRoIGZvciB0ZXh0IGNvbnRlbnRcbiAgLy8gQWNjb3VudCBmb3I6IGNvbmRlbnNlZCBjbGF3ZCB3aWR0aCAoMTEgY2hhcnMpICsgZ2FwICgyKSArIHBhZGRpbmcgKDIpID0gMTUgY2hhcnNcbiAgY29uc3QgdGV4dFdpZHRoID0gTWF0aC5tYXgoY29sdW1ucyAtIDE1LCAyMClcblxuICAvLyBUcnVuY2F0ZSB2ZXJzaW9uIHRvIGZpdCB3aXRoaW4gYXZhaWxhYmxlIHdpZHRoLCBhY2NvdW50aW5nIGZvciBcIkNsYXVkZSBDb2RlIHZcIiBwcmVmaXhcbiAgY29uc3QgdmVyc2lvblByZWZpeCA9ICdDbGF1ZGUgQ29kZSB2J1xuICBjb25zdCB0cnVuY2F0ZWRWZXJzaW9uID0gdHJ1bmNhdGUoXG4gICAgdmVyc2lvbixcbiAgICBNYXRoLm1heCh0ZXh0V2lkdGggLSB2ZXJzaW9uUHJlZml4Lmxlbmd0aCwgNiksXG4gIClcblxuICBjb25zdCBlZmZvcnRTdWZmaXggPSBnZXRFZmZvcnRTdWZmaXgobW9kZWwsIGVmZm9ydFZhbHVlKVxuICBjb25zdCB7IHNob3VsZFNwbGl0LCB0cnVuY2F0ZWRNb2RlbCwgdHJ1bmNhdGVkQmlsbGluZyB9ID1cbiAgICBmb3JtYXRNb2RlbEFuZEJpbGxpbmcoXG4gICAgICBtb2RlbERpc3BsYXlOYW1lICsgZWZmb3J0U3VmZml4LFxuICAgICAgYmlsbGluZ1R5cGUsXG4gICAgICB0ZXh0V2lkdGgsXG4gICAgKVxuXG4gIC8vIFRydW5jYXRlIHBhdGgsIGFjY291bnRpbmcgZm9yIGFnZW50IG5hbWUgaWYgcHJlc2VudFxuICBjb25zdCBzZXBhcmF0b3IgPSAnIMK3ICdcbiAgY29uc3QgYXRQcmVmaXggPSAnQCdcbiAgY29uc3QgY3dkQXZhaWxhYmxlV2lkdGggPSBhZ2VudE5hbWVcbiAgICA/IHRleHRXaWR0aCAtIGF0UHJlZml4Lmxlbmd0aCAtIHN0cmluZ1dpZHRoKGFnZW50TmFtZSkgLSBzZXBhcmF0b3IubGVuZ3RoXG4gICAgOiB0ZXh0V2lkdGhcbiAgY29uc3QgdHJ1bmNhdGVkQ3dkID0gdHJ1bmNhdGVQYXRoKGN3ZCwgTWF0aC5tYXgoY3dkQXZhaWxhYmxlV2lkdGgsIDEwKSlcblxuICAvLyBPZmZzY3JlZW5GcmVlemU6IHRoZSBsb2dvIHNpdHMgYXQgdGhlIHRvcCBvZiB0aGUgbWVzc2FnZSBsaXN0IGFuZCBpcyB0aGVcbiAgLy8gZmlyc3QgdGhpbmcgdG8gZW50ZXIgc2Nyb2xsYmFjay4gdXNlTWFpbkxvb3BNb2RlbCgpIHN1YnNjcmliZXMgdG8gbW9kZWxcbiAgLy8gY2hhbmdlcyBhbmQgZ2V0TG9nb0Rpc3BsYXlEYXRhKCkgcmVhZHMgZ2V0Q3dkKCkvc3Vic2NyaXB0aW9uIHN0YXRlIOKAlCBhbnlcbiAgLy8gb2Ygd2hpY2ggY2hhbmdpbmcgd2hpbGUgaW4gc2Nyb2xsYmFjayB3b3VsZCBmb3JjZSBhIGZ1bGwgdGVybWluYWwgcmVzZXQuXG4gIHJldHVybiAoXG4gICAgPE9mZnNjcmVlbkZyZWV6ZT5cbiAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cInJvd1wiIGdhcD17Mn0gYWxpZ25JdGVtcz1cImNlbnRlclwiPlxuICAgICAge2lzRnVsbHNjcmVlbkVudkVuYWJsZWQoKSA/IDxBbmltYXRlZENsYXdkIC8+IDogPENsYXdkIC8+fVxuXG4gICAgICB7LyogSW5mbyAqL31cbiAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiPlxuICAgICAgICA8VGV4dD5cbiAgICAgICAgICA8VGV4dCBib2xkPkNsYXVkZSBDb2RlPC9UZXh0PnsnICd9XG4gICAgICAgICAgPFRleHQgZGltQ29sb3I+dnt0cnVuY2F0ZWRWZXJzaW9ufTwvVGV4dD5cbiAgICAgICAgPC9UZXh0PlxuICAgICAgICB7c2hvdWxkU3BsaXQgPyAoXG4gICAgICAgICAgPD5cbiAgICAgICAgICAgIDxUZXh0IGRpbUNvbG9yPnt0cnVuY2F0ZWRNb2RlbH08L1RleHQ+XG4gICAgICAgICAgICA8VGV4dCBkaW1Db2xvcj57dHJ1bmNhdGVkQmlsbGluZ308L1RleHQ+XG4gICAgICAgICAgPC8+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPFRleHQgZGltQ29sb3I+XG4gICAgICAgICAgICB7dHJ1bmNhdGVkTW9kZWx9IMK3IHt0cnVuY2F0ZWRCaWxsaW5nfVxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgKX1cbiAgICAgICAgPFRleHQgZGltQ29sb3I+XG4gICAgICAgICAge2FnZW50TmFtZSA/IGBAJHthZ2VudE5hbWV9IMK3ICR7dHJ1bmNhdGVkQ3dkfWAgOiB0cnVuY2F0ZWRDd2R9XG4gICAgICAgIDwvVGV4dD5cbiAgICAgICAge3Nob3dHdWVzdFBhc3Nlc1Vwc2VsbCAmJiA8R3Vlc3RQYXNzZXNVcHNlbGwgLz59XG4gICAgICAgIHshc2hvd0d1ZXN0UGFzc2VzVXBzZWxsICYmIHNob3dPdmVyYWdlQ3JlZGl0VXBzZWxsICYmIChcbiAgICAgICAgICA8T3ZlcmFnZUNyZWRpdFVwc2VsbCBtYXhXaWR0aD17dGV4dFdpZHRofSB0d29MaW5lIC8+XG4gICAgICAgICl9XG4gICAgICA8L0JveD5cbiAgICAgIDwvQm94PlxuICAgIDwvT2Zmc2NyZWVuRnJlZXplPlxuICApXG59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
 
1
+ import * as React from 'react'
2
+ import { type ReactNode, useEffect } from 'react'
3
+ import { useMainLoopModel } from '../../hooks/useMainLoopModel.js'
4
+ import { useTerminalSize } from '../../hooks/useTerminalSize.js'
5
+ import { stringWidth } from '../../ink/stringWidth.js'
6
+ import { Box, Text } from '../../ink.js'
7
+ import { useAppState } from '../../state/AppState.js'
8
+ import { getEffortSuffix } from '../../utils/effort.js'
9
+ import { truncate } from '../../utils/format.js'
10
+ import { isFullscreenEnvEnabled } from '../../utils/fullscreen.js'
11
+ import {
12
+ formatModelAndBilling,
13
+ getLogoDisplayData,
14
+ truncatePath,
15
+ } from '../../utils/logoV2Utils.js'
16
+ import { renderModelSetting } from '../../utils/model/model.js'
17
+ import { OffscreenFreeze } from '../OffscreenFreeze.js'
18
+ import { AnimatedClawd } from './AnimatedClawd.js'
19
+ import { Clawd } from './Clawd.js'
20
+ import {
21
+ GuestPassesUpsell,
22
+ incrementGuestPassesSeenCount,
23
+ useShowGuestPassesUpsell,
24
+ } from './GuestPassesUpsell.js'
25
+ import {
26
+ incrementOverageCreditUpsellSeenCount,
27
+ OverageCreditUpsell,
28
+ useShowOverageCreditUpsell,
29
+ } from './OverageCreditUpsell.js'
30
+
31
+ export function CondensedLogo(): ReactNode {
32
+ const { columns } = useTerminalSize()
33
+ const agent = useAppState(s => s.agent)
34
+ const effortValue = useAppState(s => s.effortValue)
35
+ const model = useMainLoopModel()
36
+ const modelDisplayName = renderModelSetting(model)
37
+ const { version, cwd, billingType, agentName: agentNameFromSettings } = getLogoDisplayData()
38
+
39
+ // Prefer AppState.agent (set from --agent CLI flag) over settings
40
+ const agentName = agent ?? agentNameFromSettings
41
+ const showGuestPassesUpsell = useShowGuestPassesUpsell()
42
+ const showOverageCreditUpsell = useShowOverageCreditUpsell()
43
+
44
+ useEffect(() => {
45
+ if (showGuestPassesUpsell) {
46
+ incrementGuestPassesSeenCount()
47
+ }
48
+ }, [showGuestPassesUpsell])
49
+
50
+ useEffect(() => {
51
+ if (showOverageCreditUpsell && !showGuestPassesUpsell) {
52
+ incrementOverageCreditUpsellSeenCount()
53
+ }
54
+ }, [showOverageCreditUpsell, showGuestPassesUpsell])
55
+
56
+ // Calculate available width for text content
57
+ // Account for: condensed clawd width (11 chars) + gap (2) + padding (2) = 15 chars
58
+ const textWidth = Math.max(columns - 15, 20)
59
+
60
+ // Truncate version to fit within available width, accounting for "Claude Code v" prefix
61
+ const versionPrefix = 'Claude Code v'
62
+ const truncatedVersion = truncate(
63
  version,
64
+ Math.max(textWidth - versionPrefix.length, 6),
65
+ )
66
+
67
+ const effortSuffix = getEffortSuffix(model, effortValue)
68
+ const { shouldSplit, truncatedModel, truncatedBilling } =
69
+ formatModelAndBilling(
70
+ modelDisplayName + effortSuffix,
71
+ billingType,
72
+ textWidth,
73
+ )
74
+
75
+ // Truncate path, accounting for agent name if present
76
+ const separator = ' Β· '
77
+ const atPrefix = '@'
78
+ const cwdAvailableWidth = agentName
79
+ ? textWidth - atPrefix.length - stringWidth(agentName) - separator.length
80
+ : textWidth
81
+ const truncatedCwd = truncatePath(cwd, Math.max(cwdAvailableWidth, 10))
82
+
83
+ // OffscreenFreeze: the logo sits at the top of the message list and is the
84
+ // first thing to enter scrollback. useMainLoopModel() subscribes to model
85
+ // changes and getLogoDisplayData() reads getCwd()/subscription state β€” any
86
+ // of which changing while in scrollback would force a full terminal reset.
87
+ return (
88
+ <OffscreenFreeze>
89
+ <Box flexDirection="row" gap={2} alignItems="center">
90
+ {isFullscreenEnvEnabled() ? <AnimatedClawd /> : <Clawd />}
91
+
92
+ {/* Info */}
93
+ <Box flexDirection="column">
94
+ <Text>
95
+ <Text bold>Claude Code</Text>{' '}
96
+ <Text dimColor>v{truncatedVersion}</Text>
97
+ </Text>
98
+ {shouldSplit ? (
99
+ <>
100
+ <Text dimColor>{truncatedModel}</Text>
101
+ <Text dimColor>{truncatedBilling}</Text>
102
+ </>
103
+ ) : (
104
+ <Text dimColor>
105
+ {truncatedModel} Β· {truncatedBilling}
106
+ </Text>
107
+ )}
108
+ <Text dimColor>
109
+ {agentName ? `@${agentName} Β· ${truncatedCwd}` : truncatedCwd}
110
+ </Text>
111
+ {showGuestPassesUpsell && <GuestPassesUpsell />}
112
+ {!showGuestPassesUpsell && showOverageCreditUpsell && (
113
+ <OverageCreditUpsell maxWidth={textWidth} twoLine />
114
+ )}
115
+ </Box>
116
+ </Box>
117
+ </OffscreenFreeze>
118
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
119
  }
 
 
 
 
 
 
 
src/components/LogoV2/Feed.tsx CHANGED
@@ -1,112 +1,113 @@
1
- import { c as _c } from "react/compiler-runtime";
2
- import * as React from 'react';
3
- import { stringWidth } from '../../ink/stringWidth.js';
4
- import { Box, Text } from '../../ink.js';
5
- import { truncate } from '../../utils/format.js';
6
  export type FeedLine = {
7
- text: string;
8
- timestamp?: string;
9
- };
 
10
  export type FeedConfig = {
11
- title: string;
12
- lines: FeedLine[];
13
- footer?: string;
14
- emptyMessage?: string;
15
- customContent?: {
16
- content: React.ReactNode;
17
- width: number;
18
- };
19
- };
20
  type FeedProps = {
21
- config: FeedConfig;
22
- actualWidth: number;
23
- };
 
24
  export function calculateFeedWidth(config: FeedConfig): number {
25
- const {
26
- title,
27
- lines,
28
- footer,
29
- emptyMessage,
30
- customContent
31
- } = config;
32
- let maxWidth = stringWidth(title);
33
  if (customContent !== undefined) {
34
- maxWidth = Math.max(maxWidth, customContent.width);
35
  } else if (lines.length === 0 && emptyMessage) {
36
- maxWidth = Math.max(maxWidth, stringWidth(emptyMessage));
37
  } else {
38
- const gap = ' ';
39
- const maxTimestampWidth = Math.max(0, ...lines.map(line => line.timestamp ? stringWidth(line.timestamp) : 0));
 
 
 
 
40
  for (const line of lines) {
41
- const timestampWidth = maxTimestampWidth > 0 ? maxTimestampWidth : 0;
42
- const lineWidth = stringWidth(line.text) + (timestampWidth > 0 ? timestampWidth + gap.length : 0);
43
- maxWidth = Math.max(maxWidth, lineWidth);
 
 
44
  }
45
  }
 
46
  if (footer) {
47
- maxWidth = Math.max(maxWidth, stringWidth(footer));
48
- }
49
- return maxWidth;
50
- }
51
- export function Feed(t0) {
52
- const $ = _c(15);
53
- const {
54
- config,
55
- actualWidth
56
- } = t0;
57
- const {
58
- title,
59
- lines,
60
- footer,
61
- emptyMessage,
62
- customContent
63
- } = config;
64
- let t1;
65
- if ($[0] !== lines) {
66
- t1 = Math.max(0, ...lines.map(_temp));
67
- $[0] = lines;
68
- $[1] = t1;
69
- } else {
70
- t1 = $[1];
71
- }
72
- const maxTimestampWidth = t1;
73
- let t2;
74
- if ($[2] !== title) {
75
- t2 = <Text bold={true} color="startupAccent">{title}</Text>;
76
- $[2] = title;
77
- $[3] = t2;
78
- } else {
79
- t2 = $[3];
80
- }
81
- let t3;
82
- if ($[4] !== actualWidth || $[5] !== customContent || $[6] !== emptyMessage || $[7] !== footer || $[8] !== lines || $[9] !== maxTimestampWidth) {
83
- t3 = customContent ? <>{customContent.content}{footer && <Text dimColor={true} italic={true}>{truncate(footer, actualWidth)}</Text>}</> : lines.length === 0 && emptyMessage ? <Text dimColor={true}>{truncate(emptyMessage, actualWidth)}</Text> : <>{lines.map((line_0, index) => {
84
- const textWidth = Math.max(10, actualWidth - (maxTimestampWidth > 0 ? maxTimestampWidth + 2 : 0));
85
- return <Text key={index}>{maxTimestampWidth > 0 && <><Text dimColor={true}>{(line_0.timestamp || "").padEnd(maxTimestampWidth)}</Text>{" "}</>}<Text>{truncate(line_0.text, textWidth)}</Text></Text>;
86
- })}{footer && <Text dimColor={true} italic={true}>{truncate(footer, actualWidth)}</Text>}</>;
87
- $[4] = actualWidth;
88
- $[5] = customContent;
89
- $[6] = emptyMessage;
90
- $[7] = footer;
91
- $[8] = lines;
92
- $[9] = maxTimestampWidth;
93
- $[10] = t3;
94
- } else {
95
- t3 = $[10];
96
- }
97
- let t4;
98
- if ($[11] !== actualWidth || $[12] !== t2 || $[13] !== t3) {
99
- t4 = <Box flexDirection="column" width={actualWidth}>{t2}{t3}</Box>;
100
- $[11] = actualWidth;
101
- $[12] = t2;
102
- $[13] = t3;
103
- $[14] = t4;
104
- } else {
105
- t4 = $[14];
106
  }
107
- return t4;
 
108
  }
109
- function _temp(line) {
110
- return line.timestamp ? stringWidth(line.timestamp) : 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
111
  }
112
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInN0cmluZ1dpZHRoIiwiQm94IiwiVGV4dCIsInRydW5jYXRlIiwiRmVlZExpbmUiLCJ0ZXh0IiwidGltZXN0YW1wIiwiRmVlZENvbmZpZyIsInRpdGxlIiwibGluZXMiLCJmb290ZXIiLCJlbXB0eU1lc3NhZ2UiLCJjdXN0b21Db250ZW50IiwiY29udGVudCIsIlJlYWN0Tm9kZSIsIndpZHRoIiwiRmVlZFByb3BzIiwiY29uZmlnIiwiYWN0dWFsV2lkdGgiLCJjYWxjdWxhdGVGZWVkV2lkdGgiLCJtYXhXaWR0aCIsInVuZGVmaW5lZCIsIk1hdGgiLCJtYXgiLCJsZW5ndGgiLCJnYXAiLCJtYXhUaW1lc3RhbXBXaWR0aCIsIm1hcCIsImxpbmUiLCJ0aW1lc3RhbXBXaWR0aCIsImxpbmVXaWR0aCIsIkZlZWQiLCJ0MCIsIiQiLCJfYyIsInQxIiwiX3RlbXAiLCJ0MiIsInQzIiwibGluZV8wIiwiaW5kZXgiLCJ0ZXh0V2lkdGgiLCJwYWRFbmQiLCJ0NCJdLCJzb3VyY2VzIjpbIkZlZWQudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgc3RyaW5nV2lkdGggfSBmcm9tICcuLi8uLi9pbmsvc3RyaW5nV2lkdGguanMnXG5pbXBvcnQgeyBCb3gsIFRleHQgfSBmcm9tICcuLi8uLi9pbmsuanMnXG5pbXBvcnQgeyB0cnVuY2F0ZSB9IGZyb20gJy4uLy4uL3V0aWxzL2Zvcm1hdC5qcydcblxuZXhwb3J0IHR5cGUgRmVlZExpbmUgPSB7XG4gIHRleHQ6IHN0cmluZ1xuICB0aW1lc3RhbXA/OiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgRmVlZENvbmZpZyA9IHtcbiAgdGl0bGU6IHN0cmluZ1xuICBsaW5lczogRmVlZExpbmVbXVxuICBmb290ZXI/OiBzdHJpbmdcbiAgZW1wdHlNZXNzYWdlPzogc3RyaW5nXG4gIGN1c3RvbUNvbnRlbnQ/OiB7IGNvbnRlbnQ6IFJlYWN0LlJlYWN0Tm9kZTsgd2lkdGg6IG51bWJlciB9XG59XG5cbnR5cGUgRmVlZFByb3BzID0ge1xuICBjb25maWc6IEZlZWRDb25maWdcbiAgYWN0dWFsV2lkdGg6IG51bWJlclxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlRmVlZFdpZHRoKGNvbmZpZzogRmVlZENvbmZpZyk6IG51bWJlciB7XG4gIGNvbnN0IHsgdGl0bGUsIGxpbmVzLCBmb290ZXIsIGVtcHR5TWVzc2FnZSwgY3VzdG9tQ29udGVudCB9ID0gY29uZmlnXG5cbiAgbGV0IG1heFdpZHRoID0gc3RyaW5nV2lkdGgodGl0bGUpXG5cbiAgaWYgKGN1c3RvbUNvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgIG1heFdpZHRoID0gTWF0aC5tYXgobWF4V2lkdGgsIGN1c3RvbUNvbnRlbnQud2lkdGgpXG4gIH0gZWxzZSBpZiAobGluZXMubGVuZ3RoID09PSAwICYmIGVtcHR5TWVzc2FnZSkge1xuICAgIG1heFdpZHRoID0gTWF0aC5tYXgobWF4V2lkdGgsIHN0cmluZ1dpZHRoKGVtcHR5TWVzc2FnZSkpXG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZ2FwID0gJyAgJ1xuICAgIGNvbnN0IG1heFRpbWVzdGFtcFdpZHRoID0gTWF0aC5tYXgoXG4gICAgICAwLFxuICAgICAgLi4ubGluZXMubWFwKGxpbmUgPT4gKGxpbmUudGltZXN0YW1wID8gc3RyaW5nV2lkdGgobGluZS50aW1lc3RhbXApIDogMCkpLFxuICAgIClcblxuICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgY29uc3QgdGltZXN0YW1wV2lkdGggPSBtYXhUaW1lc3RhbXBXaWR0aCA+IDAgPyBtYXhUaW1lc3RhbXBXaWR0aCA6IDBcbiAgICAgIGNvbnN0IGxpbmVXaWR0aCA9XG4gICAgICAgIHN0cmluZ1dpZHRoKGxpbmUudGV4dCkgK1xuICAgICAgICAodGltZXN0YW1wV2lkdGggPiAwID8gdGltZXN0YW1wV2lkdGggKyBnYXAubGVuZ3RoIDogMClcbiAgICAgIG1heFdpZHRoID0gTWF0aC5tYXgobWF4V2lkdGgsIGxpbmVXaWR0aClcbiAgICB9XG4gIH1cblxuICBpZiAoZm9vdGVyKSB7XG4gICAgbWF4V2lkdGggPSBNYXRoLm1heChtYXhXaWR0aCwgc3RyaW5nV2lkdGgoZm9vdGVyKSlcbiAgfVxuXG4gIHJldHVybiBtYXhXaWR0aFxufVxuXG5leHBvcnQgZnVuY3Rpb24gRmVlZCh7IGNvbmZpZywgYWN0dWFsV2lkdGggfTogRmVlZFByb3BzKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgY29uc3QgeyB0aXRsZSwgbGluZXMsIGZvb3RlciwgZW1wdHlNZXNzYWdlLCBjdXN0b21Db250ZW50IH0gPSBjb25maWdcblxuICBjb25zdCBnYXAgPSAnICAnXG4gIGNvbnN0IG1heFRpbWVzdGFtcFdpZHRoID0gTWF0aC5tYXgoXG4gICAgMCxcbiAgICAuLi5saW5lcy5tYXAobGluZSA9PiAobGluZS50aW1lc3RhbXAgPyBzdHJpbmdXaWR0aChsaW5lLnRpbWVzdGFtcCkgOiAwKSksXG4gIClcblxuICByZXR1cm4gKFxuICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiIHdpZHRoPXthY3R1YWxXaWR0aH0+XG4gICAgICA8VGV4dCBib2xkIGNvbG9yPVwiY2xhdWRlXCI+XG4gICAgICAgIHt0aXRsZX1cbiAgICAgIDwvVGV4dD5cbiAgICAgIHtjdXN0b21Db250ZW50ID8gKFxuICAgICAgICA8PlxuICAgICAgICAgIHtjdXN0b21Db250ZW50LmNvbnRlbnR9XG4gICAgICAgICAge2Zvb3RlciAmJiAoXG4gICAgICAgICAgICA8VGV4dCBkaW1Db2xvciBpdGFsaWM+XG4gICAgICAgICAgICAgIHt0cnVuY2F0ZShmb290ZXIsIGFjdHVhbFdpZHRoKX1cbiAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICApfVxuICAgICAgICA8Lz5cbiAgICAgICkgOiBsaW5lcy5sZW5ndGggPT09IDAgJiYgZW1wdHlNZXNzYWdlID8gKFxuICAgICAgICA8VGV4dCBkaW1Db2xvcj57dHJ1bmNhdGUoZW1wdHlNZXNzYWdlLCBhY3R1YWxXaWR0aCl9PC9UZXh0PlxuICAgICAgKSA6IChcbiAgICAgICAgPD5cbiAgICAgICAgICB7bGluZXMubWFwKChsaW5lLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGV4dFdpZHRoID0gTWF0aC5tYXgoXG4gICAgICAgICAgICAgIDEwLFxuICAgICAgICAgICAgICBhY3R1YWxXaWR0aCAtXG4gICAgICAgICAgICAgICAgKG1heFRpbWVzdGFtcFdpZHRoID4gMCA/IG1heFRpbWVzdGFtcFdpZHRoICsgZ2FwLmxlbmd0aCA6IDApLFxuICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICA8VGV4dCBrZXk9e2luZGV4fT5cbiAgICAgICAgICAgICAgICB7bWF4VGltZXN0YW1wV2lkdGggPiAwICYmIChcbiAgICAgICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgICAgIDxUZXh0IGRpbUNvbG9yPlxuICAgICAgICAgICAgICAgICAgICAgIHsobGluZS50aW1lc3RhbXAgfHwgJycpLnBhZEVuZChtYXhUaW1lc3RhbXBXaWR0aCl9XG4gICAgICAgICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgICAgICAgICAge2dhcH1cbiAgICAgICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPFRleHQ+e3RydW5jYXRlKGxpbmUudGV4dCwgdGV4dFdpZHRoKX08L1RleHQ+XG4gICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgIClcbiAgICAgICAgICB9KX1cbiAgICAgICAgICB7Zm9vdGVyICYmIChcbiAgICAgICAgICAgIDxUZXh0IGRpbUNvbG9yIGl0YWxpYz5cbiAgICAgICAgICAgICAge3RydW5jYXRlKGZvb3RlciwgYWN0dWFsV2lkdGgpfVxuICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICl9XG4gICAgICAgIDwvPlxuICAg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
 
1
+ import * as React from 'react'
2
+ import { stringWidth } from '../../ink/stringWidth.js'
3
+ import { Box, Text } from '../../ink.js'
4
+ import { truncate } from '../../utils/format.js'
5
+
6
  export type FeedLine = {
7
+ text: string
8
+ timestamp?: string
9
+ }
10
+
11
  export type FeedConfig = {
12
+ title: string
13
+ lines: FeedLine[]
14
+ footer?: string
15
+ emptyMessage?: string
16
+ customContent?: { content: React.ReactNode; width: number }
17
+ }
18
+
 
 
19
  type FeedProps = {
20
+ config: FeedConfig
21
+ actualWidth: number
22
+ }
23
+
24
  export function calculateFeedWidth(config: FeedConfig): number {
25
+ const { title, lines, footer, emptyMessage, customContent } = config
26
+
27
+ let maxWidth = stringWidth(title)
28
+
 
 
 
 
29
  if (customContent !== undefined) {
30
+ maxWidth = Math.max(maxWidth, customContent.width)
31
  } else if (lines.length === 0 && emptyMessage) {
32
+ maxWidth = Math.max(maxWidth, stringWidth(emptyMessage))
33
  } else {
34
+ const gap = ' '
35
+ const maxTimestampWidth = Math.max(
36
+ 0,
37
+ ...lines.map(line => (line.timestamp ? stringWidth(line.timestamp) : 0)),
38
+ )
39
+
40
  for (const line of lines) {
41
+ const timestampWidth = maxTimestampWidth > 0 ? maxTimestampWidth : 0
42
+ const lineWidth =
43
+ stringWidth(line.text) +
44
+ (timestampWidth > 0 ? timestampWidth + gap.length : 0)
45
+ maxWidth = Math.max(maxWidth, lineWidth)
46
  }
47
  }
48
+
49
  if (footer) {
50
+ maxWidth = Math.max(maxWidth, stringWidth(footer))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
51
  }
52
+
53
+ return maxWidth
54
  }
55
+
56
+ export function Feed({ config, actualWidth }: FeedProps): React.ReactNode {
57
+ const { title, lines, footer, emptyMessage, customContent } = config
58
+
59
+ const gap = ' '
60
+ const maxTimestampWidth = Math.max(
61
+ 0,
62
+ ...lines.map(line => (line.timestamp ? stringWidth(line.timestamp) : 0)),
63
+ )
64
+
65
+ return (
66
+ <Box flexDirection="column" width={actualWidth}>
67
+ <Text bold color="claude">
68
+ {title}
69
+ </Text>
70
+ {customContent ? (
71
+ <>
72
+ {customContent.content}
73
+ {footer && (
74
+ <Text dimColor italic>
75
+ {truncate(footer, actualWidth)}
76
+ </Text>
77
+ )}
78
+ </>
79
+ ) : lines.length === 0 && emptyMessage ? (
80
+ <Text dimColor>{truncate(emptyMessage, actualWidth)}</Text>
81
+ ) : (
82
+ <>
83
+ {lines.map((line, index) => {
84
+ const textWidth = Math.max(
85
+ 10,
86
+ actualWidth -
87
+ (maxTimestampWidth > 0 ? maxTimestampWidth + gap.length : 0),
88
+ )
89
+
90
+ return (
91
+ <Text key={index}>
92
+ {maxTimestampWidth > 0 && (
93
+ <>
94
+ <Text dimColor>
95
+ {(line.timestamp || '').padEnd(maxTimestampWidth)}
96
+ </Text>
97
+ {gap}
98
+ </>
99
+ )}
100
+ <Text>{truncate(line.text, textWidth)}</Text>
101
+ </Text>
102
+ )
103
+ })}
104
+ {footer && (
105
+ <Text dimColor italic>
106
+ {truncate(footer, actualWidth)}
107
+ </Text>
108
+ )}
109
+ </>
110
+ )}
111
+ </Box>
112
+ )
113
  }
 
src/components/LogoV2/FeedColumn.tsx CHANGED
@@ -1,59 +1,32 @@
1
- import { c as _c } from "react/compiler-runtime";
2
- import * as React from 'react';
3
- import { Box } from '../../ink.js';
4
- import { Divider } from '../design-system/Divider.js';
5
- import type { FeedConfig } from './Feed.js';
6
- import { calculateFeedWidth, Feed } from './Feed.js';
7
  type FeedColumnProps = {
8
- feeds: FeedConfig[];
9
- maxWidth: number;
10
- };
11
- export function FeedColumn(t0) {
12
- const $ = _c(10);
13
- const {
14
- feeds,
15
- maxWidth
16
- } = t0;
17
- let t1;
18
- if ($[0] !== feeds) {
19
- const feedWidths = feeds.map(_temp);
20
- t1 = Math.max(...feedWidths);
21
- $[0] = feeds;
22
- $[1] = t1;
23
- } else {
24
- t1 = $[1];
25
- }
26
- const maxOfAllFeeds = t1;
27
- const actualWidth = Math.min(maxOfAllFeeds, maxWidth);
28
- let t2;
29
- if ($[2] !== actualWidth || $[3] !== feeds) {
30
- let t3;
31
- if ($[5] !== actualWidth || $[6] !== feeds.length) {
32
- t3 = (feed_0, index) => <React.Fragment key={index}><Feed config={feed_0} actualWidth={actualWidth} />{index < feeds.length - 1 && <Divider color="startupAccent" width={actualWidth} />}</React.Fragment>;
33
- $[5] = actualWidth;
34
- $[6] = feeds.length;
35
- $[7] = t3;
36
- } else {
37
- t3 = $[7];
38
- }
39
- t2 = feeds.map(t3);
40
- $[2] = actualWidth;
41
- $[3] = feeds;
42
- $[4] = t2;
43
- } else {
44
- t2 = $[4];
45
- }
46
- let t3;
47
- if ($[8] !== t2) {
48
- t3 = <Box flexDirection="column">{t2}</Box>;
49
- $[8] = t2;
50
- $[9] = t3;
51
- } else {
52
- t3 = $[9];
53
- }
54
- return t3;
55
  }
56
- function _temp(feed) {
57
- return calculateFeedWidth(feed);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58
  }
59
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIkJveCIsIkRpdmlkZXIiLCJGZWVkQ29uZmlnIiwiY2FsY3VsYXRlRmVlZFdpZHRoIiwiRmVlZCIsIkZlZWRDb2x1bW5Qcm9wcyIsImZlZWRzIiwibWF4V2lkdGgiLCJGZWVkQ29sdW1uIiwidDAiLCIkIiwiX2MiLCJ0MSIsImZlZWRXaWR0aHMiLCJtYXAiLCJfdGVtcCIsIk1hdGgiLCJtYXgiLCJtYXhPZkFsbEZlZWRzIiwiYWN0dWFsV2lkdGgiLCJtaW4iLCJ0MiIsInQzIiwibGVuZ3RoIiwiZmVlZF8wIiwiaW5kZXgiLCJmZWVkIl0sInNvdXJjZXMiOlsiRmVlZENvbHVtbi50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBCb3ggfSBmcm9tICcuLi8uLi9pbmsuanMnXG5pbXBvcnQgeyBEaXZpZGVyIH0gZnJvbSAnLi4vZGVzaWduLXN5c3RlbS9EaXZpZGVyLmpzJ1xuaW1wb3J0IHR5cGUgeyBGZWVkQ29uZmlnIH0gZnJvbSAnLi9GZWVkLmpzJ1xuaW1wb3J0IHsgY2FsY3VsYXRlRmVlZFdpZHRoLCBGZWVkIH0gZnJvbSAnLi9GZWVkLmpzJ1xuXG50eXBlIEZlZWRDb2x1bW5Qcm9wcyA9IHtcbiAgZmVlZHM6IEZlZWRDb25maWdbXVxuICBtYXhXaWR0aDogbnVtYmVyXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBGZWVkQ29sdW1uKHtcbiAgZmVlZHMsXG4gIG1heFdpZHRoLFxufTogRmVlZENvbHVtblByb3BzKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgY29uc3QgZmVlZFdpZHRocyA9IGZlZWRzLm1hcChmZWVkID0+IGNhbGN1bGF0ZUZlZWRXaWR0aChmZWVkKSlcbiAgY29uc3QgbWF4T2ZBbGxGZWVkcyA9IE1hdGgubWF4KC4uLmZlZWRXaWR0aHMpXG4gIGNvbnN0IGFjdHVhbFdpZHRoID0gTWF0aC5taW4obWF4T2ZBbGxGZWVkcywgbWF4V2lkdGgpXG5cbiAgcmV0dXJuIChcbiAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIj5cbiAgICAgIHtmZWVkcy5tYXAoKGZlZWQsIGluZGV4KSA9PiAoXG4gICAgICAgIDxSZWFjdC5GcmFnbWVudCBrZXk9e2luZGV4fT5cbiAgICAgICAgICA8RmVlZCBjb25maWc9e2ZlZWR9IGFjdHVhbFdpZHRoPXthY3R1YWxXaWR0aH0gLz5cbiAgICAgICAgICB7aW5kZXggPCBmZWVkcy5sZW5ndGggLSAxICYmIChcbiAgICAgICAgICAgIDxEaXZpZGVyIGNvbG9yPVwiY2xhdWRlXCIgd2lkdGg9e2FjdHVhbFdpZHRofSAvPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+XG4gICAgICApKX1cbiAgICA8L0JveD5cbiAgKVxufVxuIl0sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxLQUFLQSxLQUFLLE1BQU0sT0FBTztBQUM5QixTQUFTQyxHQUFHLFFBQVEsY0FBYztBQUNsQyxTQUFTQyxPQUFPLFFBQVEsNkJBQTZCO0FBQ3JELGNBQWNDLFVBQVUsUUFBUSxXQUFXO0FBQzNDLFNBQVNDLGtCQUFrQixFQUFFQyxJQUFJLFFBQVEsV0FBVztBQUVwRCxLQUFLQyxlQUFlLEdBQUc7RUFDckJDLEtBQUssRUFBRUosVUFBVSxFQUFFO0VBQ25CSyxRQUFRLEVBQUUsTUFBTTtBQUNsQixDQUFDO0FBRUQsT0FBTyxTQUFBQyxXQUFBQyxFQUFBO0VBQUEsTUFBQUMsQ0FBQSxHQUFBQyxFQUFBO0VBQW9CO0lBQUFMLEtBQUE7SUFBQUM7RUFBQSxJQUFBRSxFQUdUO0VBQUEsSUFBQUcsRUFBQTtFQUFBLElBQUFGLENBQUEsUUFBQUosS0FBQTtJQUNoQixNQUFBTyxVQUFBLEdBQW1CUCxLQUFLLENBQUFRLEdBQUksQ0FBQ0MsS0FBZ0MsQ0FBQztJQUN4Q0gsRUFBQSxHQUFBSSxJQUFJLENBQUFDLEdBQUksSUFBSUosVUFBVSxDQUFDO0lBQUFILENBQUEsTUFBQUosS0FBQTtJQUFBSSxDQUFBLE1BQUFFLEVBQUE7RUFBQTtJQUFBQSxFQUFBLEdBQUFGLENBQUE7RUFBQTtFQUE3QyxNQUFBUSxhQUFBLEdBQXNCTixFQUF1QjtFQUM3QyxNQUFBTyxXQUFBLEdBQW9CSCxJQUFJLENBQUFJLEdBQUksQ0FBQ0YsYUFBYSxFQUFFWCxRQUFRLENBQUM7RUFBQSxJQUFBYyxFQUFBO0VBQUEsSUFBQVgsQ0FBQSxRQUFBUyxXQUFBLElBQUFULENBQUEsUUFBQUosS0FBQTtJQUFBLElBQUFnQixFQUFBO0lBQUEsSUFBQVosQ0FBQSxRQUFBUyxXQUFBLElBQUFULENBQUEsUUFBQUosS0FBQSxDQUFBaUIsTUFBQTtNQUl0Q0QsRUFBQSxHQUFBQSxDQUFBRSxNQUFBLEVBQUFDLEtBQUEsS0FDVCxnQkFBcUJBLEdBQUssQ0FBTEEsTUFBSSxDQUFDLENBQ3hCLENBQUMsSUFBSSxDQUFTQyxNQUFJLENBQUpBLE9BQUcsQ0FBQyxDQUFlUCxXQUFXLENBQVhBLFlBQVUsQ0FBQyxHQUMzQyxDQUFBTSxLQUFLLEdBQUduQixLQUFLLENBQUFpQixNQUFPLEdBQUcsQ0FFdkIsSUFEQyxDQUFDLE9BQU8sQ0FBTyxLQUFRLENBQVIsUUFBUSxDQUFRSixLQUFXLENBQVhBLFlBQVUsQ0FBQyxHQUM1QyxDQUNGLGlCQUNEO01BQUFULENBQUEsTUFBQVMsV0FBQTtNQUFBVCxDQUFBLE1BQUFKLEtBQUEsQ0FBQWlCLE1BQUE7TUFBQWIsQ0FBQSxNQUFBWSxFQUFBO0lBQUE7TUFBQUEsRUFBQSxHQUFBWixDQUFBO0lBQUE7SUFQQVcsRUFBQSxHQUFBZixLQUFLLENBQUFRLEdBQUksQ0FBQ1EsRUFPVixDQUFDO0lBQUFaLENBQUEsTUFBQVMsV0FBQTtJQUFBVCxDQUFBLE1BQUFKLEtBQUE7SUFBQUksQ0FBQSxNQUFBVyxFQUFBO0VBQUE7SUFBQUEsRUFBQSxHQUFBWCxDQUFBO0VBQUE7RUFBQSxJQUFBWSxFQUFBO0VBQUEsSUFBQVosQ0FBQSxRQUFBVyxFQUFBO0lBUkpDLEVBQUEsSUFBQyxHQUFHLENBQWUsYUFBUSxDQUFSLFFBQVEsQ0FDeEIsQ0FBQUQsRUFPQSxDQUNILEVBVEMsR0FBRyxDQVNFO0lBQUFYLENBQUEsTUFBQVcsRUFBQTtJQUFBWCxDQUFBLE1BQUFZLEVBQUE7RUFBQTtJQUFBQSxFQUFBLEdBQUFaLENBQUE7RUFBQTtFQUFBLE9BVE5ZLEVBU007QUFBQTtBQWxCSCxTQUFBUCxNQUFBVyxJQUFBO0VBQUEsT0FJZ0N2QixrQkFBa0IsQ0FBQ3VCLElBQUksQ0FBQztBQUFBIiwiaWdub3JlTGlzdCI6W119
 
1
+ import * as React from 'react'
2
+ import { Box } from '../../ink.js'
3
+ import { Divider } from '../design-system/Divider.js'
4
+ import type { FeedConfig } from './Feed.js'
5
+ import { calculateFeedWidth, Feed } from './Feed.js'
6
+
7
  type FeedColumnProps = {
8
+ feeds: FeedConfig[]
9
+ maxWidth: number
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
  }
11
+
12
+ export function FeedColumn({
13
+ feeds,
14
+ maxWidth,
15
+ }: FeedColumnProps): React.ReactNode {
16
+ const feedWidths = feeds.map(feed => calculateFeedWidth(feed))
17
+ const maxOfAllFeeds = Math.max(...feedWidths)
18
+ const actualWidth = Math.min(maxOfAllFeeds, maxWidth)
19
+
20
+ return (
21
+ <Box flexDirection="column">
22
+ {feeds.map((feed, index) => (
23
+ <React.Fragment key={index}>
24
+ <Feed config={feed} actualWidth={actualWidth} />
25
+ {index < feeds.length - 1 && (
26
+ <Divider color="claude" width={actualWidth} />
27
+ )}
28
+ </React.Fragment>
29
+ ))}
30
+ </Box>
31
+ )
32
  }
 
src/components/LogoV2/GuestPassesUpsell.tsx CHANGED
@@ -1,70 +1,73 @@
1
- import { c as _c } from "react/compiler-runtime";
2
- import * as React from 'react';
3
- import { useState } from 'react';
4
- import { Text } from '../../ink.js';
5
- import { logEvent } from '../../services/analytics/index.js';
6
- import { checkCachedPassesEligibility, formatCreditAmount, getCachedReferrerReward, getCachedRemainingPasses } from '../../services/api/referral.js';
7
- import { getGlobalConfig, saveGlobalConfig } from '../../utils/config.js';
 
 
 
 
 
8
  function resetIfPassesRefreshed(): void {
9
- const remaining = getCachedRemainingPasses();
10
- if (remaining == null || remaining <= 0) return;
11
- const config = getGlobalConfig();
12
- const lastSeen = config.passesLastSeenRemaining ?? 0;
13
  if (remaining > lastSeen) {
14
  saveGlobalConfig(prev => ({
15
  ...prev,
16
  passesUpsellSeenCount: 0,
17
  hasVisitedPasses: false,
18
- passesLastSeenRemaining: remaining
19
- }));
20
  }
21
  }
 
22
  function shouldShowGuestPassesUpsell(): boolean {
23
- const {
24
- eligible,
25
- hasCache
26
- } = checkCachedPassesEligibility();
27
  // Only show if eligible and cache exists (don't block on fetch)
28
- if (!eligible || !hasCache) return false;
29
  // Reset upsell counters if passes were refreshed (covers both campaign change and pass refresh)
30
- resetIfPassesRefreshed();
31
- const config = getGlobalConfig();
32
- if ((config.passesUpsellSeenCount ?? 0) >= 3) return false;
33
- if (config.hasVisitedPasses) return false;
34
- return true;
35
- }
36
- export function useShowGuestPassesUpsell() {
37
- const [show] = useState(_temp);
38
- return show;
39
  }
40
- function _temp() {
41
- return shouldShowGuestPassesUpsell();
 
 
42
  }
 
43
  export function incrementGuestPassesSeenCount(): void {
44
- let newCount = 0;
45
  saveGlobalConfig(prev => {
46
- newCount = (prev.passesUpsellSeenCount ?? 0) + 1;
47
  return {
48
  ...prev,
49
- passesUpsellSeenCount: newCount
50
- };
51
- });
52
  logEvent('tengu_guest_passes_upsell_shown', {
53
- seen_count: newCount
54
- });
55
  }
56
 
57
  // Condensed layout for mini welcome screen
58
- export function GuestPassesUpsell() {
59
- const $ = _c(1);
60
- let t0;
61
- if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
62
- const reward = getCachedReferrerReward();
63
- t0 = <Text dimColor={true}><Text color="startupAccent">[✻]</Text> <Text color="startupAccent">[✻]</Text>{" "}<Text color="startupAccent">[✻]</Text> ·{" "}{reward ? `Share VersperClaw and earn ${formatCreditAmount(reward)} of extra usage · /passes` : "3 guest passes at /passes"}</Text>;
64
- $[0] = t0;
65
- } else {
66
- t0 = $[0];
67
- }
68
- return t0;
69
  }
70
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZVN0YXRlIiwiVGV4dCIsImxvZ0V2ZW50IiwiY2hlY2tDYWNoZWRQYXNzZXNFbGlnaWJpbGl0eSIsImZvcm1hdENyZWRpdEFtb3VudCIsImdldENhY2hlZFJlZmVycmVyUmV3YXJkIiwiZ2V0Q2FjaGVkUmVtYWluaW5nUGFzc2VzIiwiZ2V0R2xvYmFsQ29uZmlnIiwic2F2ZUdsb2JhbENvbmZpZyIsInJlc2V0SWZQYXNzZXNSZWZyZXNoZWQiLCJyZW1haW5pbmciLCJjb25maWciLCJsYXN0U2VlbiIsInBhc3Nlc0xhc3RTZWVuUmVtYWluaW5nIiwicHJldiIsInBhc3Nlc1Vwc2VsbFNlZW5Db3VudCIsImhhc1Zpc2l0ZWRQYXNzZXMiLCJzaG91bGRTaG93R3Vlc3RQYXNzZXNVcHNlbGwiLCJlbGlnaWJsZSIsImhhc0NhY2hlIiwidXNlU2hvd0d1ZXN0UGFzc2VzVXBzZWxsIiwic2hvdyIsIl90ZW1wIiwiaW5jcmVtZW50R3Vlc3RQYXNzZXNTZWVuQ291bnQiLCJuZXdDb3VudCIsInNlZW5fY291bnQiLCJHdWVzdFBhc3Nlc1Vwc2VsbCIsIiQiLCJfYyIsInQwIiwiU3ltYm9sIiwiZm9yIiwicmV3YXJkIl0sInNvdXJjZXMiOlsiR3Vlc3RQYXNzZXNVcHNlbGwudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IFRleHQgfSBmcm9tICcuLi8uLi9pbmsuanMnXG5pbXBvcnQgeyBsb2dFdmVudCB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FuYWx5dGljcy9pbmRleC5qcydcbmltcG9ydCB7XG4gIGNoZWNrQ2FjaGVkUGFzc2VzRWxpZ2liaWxpdHksXG4gIGZvcm1hdENyZWRpdEFtb3VudCxcbiAgZ2V0Q2FjaGVkUmVmZXJyZXJSZXdhcmQsXG4gIGdldENhY2hlZFJlbWFpbmluZ1Bhc3Nlcyxcbn0gZnJvbSAnLi4vLi4vc2VydmljZXMvYXBpL3JlZmVycmFsLmpzJ1xuaW1wb3J0IHsgZ2V0R2xvYmFsQ29uZmlnLCBzYXZlR2xvYmFsQ29uZmlnIH0gZnJvbSAnLi4vLi4vdXRpbHMvY29uZmlnLmpzJ1xuXG5mdW5jdGlvbiByZXNldElmUGFzc2VzUmVmcmVzaGVkKCk6IHZvaWQge1xuICBjb25zdCByZW1haW5pbmcgPSBnZXRDYWNoZWRSZW1haW5pbmdQYXNzZXMoKVxuICBpZiAocmVtYWluaW5nID09IG51bGwgfHwgcmVtYWluaW5nIDw9IDApIHJldHVyblxuICBjb25zdCBjb25maWcgPSBnZXRHbG9iYWxDb25maWcoKVxuICBjb25zdCBsYXN0U2VlbiA9IGNvbmZpZy5wYXNzZXNMYXN0U2VlblJlbWFpbmluZyA/PyAwXG4gIGlmIChyZW1haW5pbmcgPiBsYXN0U2Vlbikge1xuICAgIHNhdmVHbG9iYWxDb25maWcocHJldiA9PiAoe1xuICAgICAgLi4ucHJldixcbiAgICAgIHBhc3Nlc1Vwc2VsbFNlZW5Db3VudDogMCxcbiAgICAgIGhhc1Zpc2l0ZWRQYXNzZXM6IGZhbHNlLFxuICAgICAgcGFzc2VzTGFzdFNlZW5SZW1haW5pbmc6IHJlbWFpbmluZyxcbiAgICB9KSlcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRTaG93R3Vlc3RQYXNzZXNVcHNlbGwoKTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgZWxpZ2libGUsIGhhc0NhY2hlIH0gPSBjaGVja0NhY2hlZFBhc3Nlc0VsaWdpYmlsaXR5KClcbiAgLy8gT25seSBzaG93IGlmIGVsaWdpYmxlIGFuZCBjYWNoZSBleGlzdHMgKGRvbid0IGJsb2NrIG9uIGZldGNoKVxuICBpZiAoIWVsaWdpYmxlIHx8ICFoYXNDYWNoZSkgcmV0dXJuIGZhbHNlXG4gIC8vIFJlc2V0IHVwc2VsbCBjb3VudGVycyBpZiBwYXNzZXMgd2VyZSByZWZyZXNoZWQgKGNvdmVycyBib3RoIGNhbXBhaWduIGNoYW5nZSBhbmQgcGFzcyByZWZyZXNoKVxuICByZXNldElmUGFzc2VzUmVmcmVzaGVkKClcblxuICBjb25zdCBjb25maWcgPSBnZXRHbG9iYWxDb25maWcoKVxuICBpZiAoKGNvbmZpZy5wYXNzZXNVcHNlbGxTZWVuQ291bnQgPz8gMCkgPj0gMykgcmV0dXJuIGZhbHNlXG4gIGlmIChjb25maWcuaGFzVmlzaXRlZFBhc3NlcykgcmV0dXJuIGZhbHNlXG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVNob3dHdWVzdFBhc3Nlc1Vwc2VsbCgpOiBib29sZWFuIHtcbiAgY29uc3QgW3Nob3ddID0gdXNlU3RhdGUoKCkgPT4gc2hvdWxkU2hvd0d1ZXN0UGFzc2VzVXBzZWxsKCkpXG4gIHJldHVybiBzaG93XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmNyZW1lbnRHdWVzdFBhc3Nlc1NlZW5Db3VudCgpOiB2b2lkIHtcbiAgbGV0IG5ld0NvdW50ID0gMFxuICBzYXZlR2xvYmFsQ29uZmlnKHByZXYgPT4ge1xuICAgIG5ld0NvdW50ID0gKHByZXYucGFzc2VzVXBzZWxsU2VlbkNvdW50ID8/IDApICsgMVxuICAgIHJldHVybiB7XG4gICAgICAuLi5wcmV2LFxuICAgICAgcGFzc2VzVXBzZWxsU2VlbkNvdW50OiBuZXdDb3VudCxcbiAgICB9XG4gIH0pXG4gIGxvZ0V2ZW50KCd0ZW5ndV9ndWVzdF9wYXNzZXNfdXBzZWxsX3Nob3duJywge1xuICAgIHNlZW5fY291bnQ6IG5ld0NvdW50LFxuICB9KVxufVxuXG4vLyBDb25kZW5zZWQgbGF5b3V0IGZvciBtaW5pIHdlbGNvbWUgc2NyZWVuXG5leHBvcnQgZnVuY3Rpb24gR3Vlc3RQYXNzZXNVcHNlbGwoKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgY29uc3QgcmV3YXJkID0gZ2V0Q2FjaGVkUmVmZXJyZXJSZXdhcmQoKVxuICByZXR1cm4gKFxuICAgIDxUZXh0IGRpbUNvbG9yPlxuICAgICAgPFRleHQgY29sb3I9XCJjbGF1ZGVcIj5b4py7XTwvVGV4dD4gPFRleHQgY29sb3I9XCJjbGF1ZGVcIj5b4py7XTwvVGV4dD57JyAnfVxuICAgICAgPFRleHQgY29sb3I9XCJjbGF1ZGVcIj5b4py7XTwvVGV4dD4gwrd7JyAnfVxuICAgICAge3Jld2FyZFxuICAgICAgICA/IGBTaGFyZSBDbGF1ZGUgQ29kZSBhbmQgZWFybiAke2Zvcm1hdENyZWRpdEFtb3VudChyZXdhcmQpfSBvZiBleHRyYSB1c2FnZSDCtyAvcGFzc2VzYFxuICAgICAgICA6ICczIGd1ZXN0IHBhc3NlcyBhdCAvcGFzc2VzJ31cbiAgICA8L1RleHQ+XG4gIClcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sS0FBS0EsS0FBSyxNQUFNLE9BQU87QUFDOUIsU0FBU0MsUUFBUSxRQUFRLE9BQU87QUFDaEMsU0FBU0MsSUFBSSxRQUFRLGNBQWM7QUFDbkMsU0FBU0MsUUFBUSxRQUFRLG1DQUFtQztBQUM1RCxTQUNFQyw0QkFBNEIsRUFDNUJDLGtCQUFrQixFQUNsQkMsdUJBQXVCLEVBQ3ZCQyx3QkFBd0IsUUFDbkIsZ0NBQWdDO0FBQ3ZDLFNBQVNDLGVBQWUsRUFBRUMsZ0JBQWdCLFFBQVEsdUJBQXVCO0FBRXpFLFNBQVNDLHNCQUFzQkEsQ0FBQSxDQUFFLEVBQUUsSUFBSSxDQUFDO0VBQ3RDLE1BQU1DLFNBQVMsR0FBR0osd0JBQXdCLENBQUMsQ0FBQztFQUM1QyxJQUFJSSxTQUFTLElBQUksSUFBSSxJQUFJQSxTQUFTLElBQUksQ0FBQyxFQUFFO0VBQ3pDLE1BQU1DLE1BQU0sR0FBR0osZUFBZSxDQUFDLENBQUM7RUFDaEMsTUFBTUssUUFBUSxHQUFHRCxNQUFNLENBQUNFLHVCQUF1QixJQUFJLENBQUM7RUFDcEQsSUFBSUgsU0FBUyxHQUFHRSxRQUFRLEVBQUU7SUFDeEJKLGdCQUFnQixDQUFDTSxJQUFJLEtBQUs7TUFDeEIsR0FBR0EsSUFBSTtNQUNQQyxxQkFBcUIsRUFBRSxDQUFDO01BQ3hCQyxnQkFBZ0IsRUFBRSxLQUFLO01BQ3ZCSCx1QkFBdUIsRUFBRUg7SUFDM0IsQ0FBQyxDQUFDLENBQUM7RUFDTDtBQUNGO0FBRUEsU0FBU08sMkJBQTJCQSxDQUFBLENBQUUsRUFBRSxPQUFPLENBQUM7RUFDOUMsTUFBTTtJQUFFQyxRQUFRO0lBQUVDO0VBQVMsQ0FBQyxHQUFHaEIsNEJBQTRCLENBQUMsQ0FBQztFQUM3RDtFQUNBLElBQUksQ0FBQ2UsUUFBUSxJQUFJLENBQUNDLFFBQVEsRUFBRSxPQUFPLEtBQUs7RUFDeEM7RUFDQVYsc0JBQXNCLENBQUMsQ0FBQztFQUV4QixNQUFNRSxNQUFNLEdBQUdKLGVBQWUsQ0FBQyxDQUFDO0VBQ2hDLElBQUksQ0FBQ0ksTUFBTSxDQUFDSSxxQkFBcUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLE9BQU8sS0FBSztFQUMxRCxJQUFJSixNQUFNLENBQUNLLGdCQUFnQixFQUFFLE9BQU8sS0FBSztFQUV6QyxPQUFPLElBQUk7QUFDYjtBQUVBLE9BQU8sU0FBQUkseUJBQUE7RUFDTCxPQUFBQyxJQUFBLElBQWVyQixRQUFRLENBQUNzQixLQUFtQyxDQUFDO0VBQUEsT0FDckRELElBQUk7QUFBQTtBQUZOLFNBQUFDLE1BQUE7RUFBQSxPQUN5QkwsMkJBQTJCLENBQUMsQ0FBQztBQUFBO0FBSTdELE9BQU8sU0FBU00sNkJBQTZCQSxDQUFBLENBQUUsRUFBRSxJQUFJLENBQUM7RUFDcEQsSUFBSUMsUUFBUSxHQUFHLENBQUM7RUFDaEJoQixnQkFBZ0IsQ0FBQ00sSUFBSSxJQUFJO0lBQ3ZCVSxRQUFRLEdBQUcsQ0FBQ1YsSUFBSSxDQUFDQyxxQkFBcUIsSUFBSSxDQUFDLElBQUksQ0FBQztJQUNoRCxPQUFPO01BQ0wsR0FBR0QsSUFBSTtNQUNQQyxxQkFBcUIsRUFBRVM7SUFDekIsQ0FBQztFQUNILENBQUMsQ0FBQztFQUNGdEIsUUFBUSxDQUFDLGlDQUFpQyxFQUFFO0lBQzFDdUIsVUFBVSxFQUFFRDtFQUNkLENBQUMsQ0FBQztBQUNKOztBQUVBO0FBQ0EsT0FBTyxTQUFBRSxrQkFBQTtFQUFBLE1BQUFDLENBQUEsR0FBQUMsRUFBQTtFQUFBLElBQUFDLEVBQUE7RUFBQSxJQUFBRixDQUFBLFFBQUFHLE1BQUEsQ0FBQUMsR0FBQTtJQUNMLE1BQUFDLE1BQUEsR0FBZTNCLHVCQUF1QixDQUFDLENBQUM7SUFFdEN3QixFQUFBLElBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBUixLQUFPLENBQUMsQ0FDWixDQUFDLElBQUksQ0FBTyxLQUFRLENBQVIsUUFBUSxDQUFDLEdBQUcsRUFBdkIsSUFBSSxDQUEwQixDQUFDLENBQUMsSUFBSSxDQUFPLEtBQVEsQ0FBUixRQUFRLENBQUMsR0FBRyxFQUF2QixJQUFJLENBQTJCLElBQUUsQ0FDbEUsQ0FBQyxJQUFJLENBQU8sS0FBUSxDQUFSLFFBQVEsQ0FBQyxHQUFHLEVBQXZCLElBQUksQ0FBMEIsRUFBRyxJQUFFLENBQ25DLENBQUFHLE1BQU0sR0FBTiw4QkFDaUM1QixrQkFBa0IsQ0FBQzRCLE1BQU0sQ0FBQywyQkFDN0IsR0FGOUIsMkJBRTZCLENBQ2hDLEVBTkMsSUFBSSxDQU1FO0lBQUFMLENBQUEsTUFBQUUsRUFBQTtFQUFBO0lBQUFBLEVBQUEsR0FBQUYsQ0FBQTtFQUFBO0VBQUEsT0FOUEUsRUFNTztBQUFBIiwiaWdub3JlTGlzdCI6W119
 
1
+ import * as React from 'react'
2
+ import { useState } from 'react'
3
+ import { Text } from '../../ink.js'
4
+ import { logEvent } from '../../services/analytics/index.js'
5
+ import {
6
+ checkCachedPassesEligibility,
7
+ formatCreditAmount,
8
+ getCachedReferrerReward,
9
+ getCachedRemainingPasses,
10
+ } from '../../services/api/referral.js'
11
+ import { getGlobalConfig, saveGlobalConfig } from '../../utils/config.js'
12
+
13
  function resetIfPassesRefreshed(): void {
14
+ const remaining = getCachedRemainingPasses()
15
+ if (remaining == null || remaining <= 0) return
16
+ const config = getGlobalConfig()
17
+ const lastSeen = config.passesLastSeenRemaining ?? 0
18
  if (remaining > lastSeen) {
19
  saveGlobalConfig(prev => ({
20
  ...prev,
21
  passesUpsellSeenCount: 0,
22
  hasVisitedPasses: false,
23
+ passesLastSeenRemaining: remaining,
24
+ }))
25
  }
26
  }
27
+
28
  function shouldShowGuestPassesUpsell(): boolean {
29
+ const { eligible, hasCache } = checkCachedPassesEligibility()
 
 
 
30
  // Only show if eligible and cache exists (don't block on fetch)
31
+ if (!eligible || !hasCache) return false
32
  // Reset upsell counters if passes were refreshed (covers both campaign change and pass refresh)
33
+ resetIfPassesRefreshed()
34
+
35
+ const config = getGlobalConfig()
36
+ if ((config.passesUpsellSeenCount ?? 0) >= 3) return false
37
+ if (config.hasVisitedPasses) return false
38
+
39
+ return true
 
 
40
  }
41
+
42
+ export function useShowGuestPassesUpsell(): boolean {
43
+ const [show] = useState(() => shouldShowGuestPassesUpsell())
44
+ return show
45
  }
46
+
47
  export function incrementGuestPassesSeenCount(): void {
48
+ let newCount = 0
49
  saveGlobalConfig(prev => {
50
+ newCount = (prev.passesUpsellSeenCount ?? 0) + 1
51
  return {
52
  ...prev,
53
+ passesUpsellSeenCount: newCount,
54
+ }
55
+ })
56
  logEvent('tengu_guest_passes_upsell_shown', {
57
+ seen_count: newCount,
58
+ })
59
  }
60
 
61
  // Condensed layout for mini welcome screen
62
+ export function GuestPassesUpsell(): React.ReactNode {
63
+ const reward = getCachedReferrerReward()
64
+ return (
65
+ <Text dimColor>
66
+ <Text color="claude">[✻]</Text> <Text color="claude">[✻]</Text>{' '}
67
+ <Text color="claude">[✻]</Text> ·{' '}
68
+ {reward
69
+ ? `Share Claude Code and earn ${formatCreditAmount(reward)} of extra usage Β· /passes`
70
+ : '3 guest passes at /passes'}
71
+ </Text>
72
+ )
73
  }
 
src/components/LogoV2/LogoV2.tsx CHANGED
@@ -1,31 +1,55 @@
1
- import { c as _c } from "react/compiler-runtime";
2
  // biome-ignore-all assist/source/organizeImports: ANT-ONLY import markers must not be reordered
3
- import * as React from 'react';
4
- import { Box, Text, color } from '../../ink.js';
5
- import { useTerminalSize } from '../../hooks/useTerminalSize.js';
6
- import { stringWidth } from '../../ink/stringWidth.js';
7
- import { getLayoutMode, calculateLayoutDimensions, calculateOptimalLeftWidth, formatWelcomeMessage, truncatePath, getRecentActivitySync, getRecentReleaseNotesSync, getLogoDisplayData } from '../../utils/logoV2Utils.js';
8
- import { truncate } from '../../utils/format.js';
9
- import { getDisplayPath } from '../../utils/file.js';
10
- import { Clawd } from './Clawd.js';
11
- import { FeedColumn } from './FeedColumn.js';
12
- import { createRecentActivityFeed, createWhatsNewFeed, createProjectOnboardingFeed, createGuestPassesFeed } from './feedConfigs.js';
13
- import { getGlobalConfig, saveGlobalConfig } from 'src/utils/config.js';
14
- import { resolveThemeSetting } from 'src/utils/systemTheme.js';
15
- import { getInitialSettings } from 'src/utils/settings/settings.js';
16
- import { isDebugMode, isDebugToStdErr, getDebugLogPath } from 'src/utils/debug.js';
17
- import { useEffect, useState } from 'react';
18
- import { getSteps, shouldShowProjectOnboarding, incrementProjectOnboardingSeenCount } from '../../projectOnboardingState.js';
19
- import { CondensedLogo } from './CondensedLogo.js';
20
- import { OffscreenFreeze } from '../OffscreenFreeze.js';
21
- import { checkForReleaseNotesSync } from '../../utils/releaseNotes.js';
22
- import { getDumpPromptsPath } from 'src/services/api/dumpPrompts.js';
23
- import { isEnvTruthy } from 'src/utils/envUtils.js';
24
- import { getStartupPerfLogPath, isDetailedProfilingEnabled } from 'src/utils/startupProfiler.js';
25
- import { EmergencyTip } from './EmergencyTip.js';
26
- import { VoiceModeNotice } from './VoiceModeNotice.js';
27
- import { Opus1mMergeNotice } from './Opus1mMergeNotice.js';
28
- import { feature } from 'bun:bundle';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
 
30
  // Conditional require so ChannelsNotice.tsx tree-shakes when both flags are
31
  // false. A module-scope helper component inside a feature() ternary does NOT
@@ -33,566 +57,444 @@ import { feature } from 'bun:bundle';
33
  // whole file. VoiceModeNotice uses the unsafe helper pattern but VOICE_MODE
34
  // is external: true so it's moot there.
35
  /* eslint-disable @typescript-eslint/no-require-imports */
36
- const ChannelsNoticeModule = feature('KAIROS') || feature('KAIROS_CHANNELS') ? require('./ChannelsNotice.js') as typeof import('./ChannelsNotice.js') : null;
 
 
 
37
  /* eslint-enable @typescript-eslint/no-require-imports */
38
- import { SandboxManager } from 'src/utils/sandbox/sandbox-adapter.js';
39
- import { useShowGuestPassesUpsell, incrementGuestPassesSeenCount } from './GuestPassesUpsell.js';
40
- import { useShowOverageCreditUpsell, incrementOverageCreditUpsellSeenCount, createOverageCreditFeed } from './OverageCreditUpsell.js';
41
- import { plural } from '../../utils/stringUtils.js';
42
- import { useAppState, useSetAppState } from '../../state/AppState.js';
43
- import { getEffortSuffix } from '../../utils/effort.js';
44
- import { useMainLoopModel } from '../../hooks/useMainLoopModel.js';
45
- import { renderModelSetting } from '../../utils/model/model.js';
46
- const LEFT_PANEL_MAX_WIDTH = 50;
47
- export function LogoV2() {
48
- const $ = _c(94);
49
- const activities = getRecentActivitySync();
50
- const username = getGlobalConfig().oauthAccount?.displayName ?? "";
51
- const {
52
- columns
53
- } = useTerminalSize();
54
- let t0;
55
- if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
56
- t0 = shouldShowProjectOnboarding();
57
- $[0] = t0;
58
- } else {
59
- t0 = $[0];
60
- }
61
- const showOnboarding = t0;
62
- let t1;
63
- if ($[1] === Symbol.for("react.memo_cache_sentinel")) {
64
- t1 = SandboxManager.isSandboxingEnabled();
65
- $[1] = t1;
66
- } else {
67
- t1 = $[1];
68
- }
69
- const showSandboxStatus = t1;
70
- const showGuestPassesUpsell = useShowGuestPassesUpsell();
71
- const showOverageCreditUpsell = useShowOverageCreditUpsell();
72
- const agent = useAppState(_temp);
73
- const effortValue = useAppState(_temp2);
74
- const config = getGlobalConfig();
75
- let changelog;
76
  try {
77
- changelog = getRecentReleaseNotesSync(3, MACRO.VERSION, config.lastReleaseNotesSeen);
78
  } catch {
79
- changelog = [];
80
  }
 
 
 
 
81
  const [announcement] = useState(() => {
82
- const announcements = getInitialSettings().companyAnnouncements;
83
- if (!announcements || announcements.length === 0) {
84
- return;
85
- }
86
- return config.numStartups === 1 ? announcements[0] : announcements[Math.floor(Math.random() * announcements.length)];
87
- });
88
- const {
89
- hasReleaseNotes
90
- } = checkForReleaseNotesSync(config.lastReleaseNotesSeen);
91
- let t2;
92
- if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
93
- t2 = () => {
94
- const currentConfig = getGlobalConfig();
95
- if (currentConfig.lastReleaseNotesSeen === MACRO.VERSION) {
96
- return;
97
- }
98
- saveGlobalConfig(_temp3);
99
- if (showOnboarding) {
100
- incrementProjectOnboardingSeenCount();
101
- }
102
- };
103
- $[2] = t2;
104
- } else {
105
- t2 = $[2];
106
- }
107
- let t3;
108
- if ($[3] !== config) {
109
- t3 = [config, showOnboarding];
110
- $[3] = config;
111
- $[4] = t3;
112
- } else {
113
- t3 = $[4];
114
- }
115
- useEffect(t2, t3);
116
- let t4;
117
- if ($[5] === Symbol.for("react.memo_cache_sentinel")) {
118
- t4 = !hasReleaseNotes && !showOnboarding && !isEnvTruthy(process.env.CLAUDE_CODE_FORCE_FULL_LOGO);
119
- $[5] = t4;
120
- } else {
121
- t4 = $[5];
122
- }
123
- const isCondensedMode = t4;
124
- let t5;
125
- let t6;
126
- if ($[6] !== showGuestPassesUpsell) {
127
- t5 = () => {
128
- if (showGuestPassesUpsell && !showOnboarding && !isCondensedMode) {
129
- incrementGuestPassesSeenCount();
130
- }
131
- };
132
- t6 = [showGuestPassesUpsell, showOnboarding, isCondensedMode];
133
- $[6] = showGuestPassesUpsell;
134
- $[7] = t5;
135
- $[8] = t6;
136
- } else {
137
- t5 = $[7];
138
- t6 = $[8];
139
- }
140
- useEffect(t5, t6);
141
- let t7;
142
- let t8;
143
- if ($[9] !== showGuestPassesUpsell || $[10] !== showOverageCreditUpsell) {
144
- t7 = () => {
145
- if (showOverageCreditUpsell && !showOnboarding && !showGuestPassesUpsell && !isCondensedMode) {
146
- incrementOverageCreditUpsellSeenCount();
147
- }
148
- };
149
- t8 = [showOverageCreditUpsell, showOnboarding, showGuestPassesUpsell, isCondensedMode];
150
- $[9] = showGuestPassesUpsell;
151
- $[10] = showOverageCreditUpsell;
152
- $[11] = t7;
153
- $[12] = t8;
154
- } else {
155
- t7 = $[11];
156
- t8 = $[12];
157
- }
158
- useEffect(t7, t8);
159
- const model = useMainLoopModel();
160
- const fullModelDisplayName = renderModelSetting(model);
161
- const setAppState = useSetAppState();
162
 
163
- // Poll for OpenRouter models when using 'default' model
164
  useEffect(() => {
165
- let mounted = true
166
- let pollTimer: NodeJS.Timeout | null = null
167
-
168
- async function checkOpenRouterCache() {
169
- try {
170
- const { getAPIProvider } = await import('../../utils/model/providers.js')
171
- const provider = getAPIProvider()
172
-
173
- if (provider === 'openrouter' && model === 'default') {
174
- // Check cache every 500ms
175
- pollTimer = setInterval(async () => {
176
- if (!mounted) {
177
- if (pollTimer) clearInterval(pollTimer)
178
- return
179
- }
180
 
181
- try {
182
- const { hasOpenRouterModelsCache } = await import('../../utils/model/openRouterModels.js')
183
- if (hasOpenRouterModelsCache()) {
184
- // Cache is now populated, trigger re-render
185
- if (mounted) {
186
- setAppState(prev => ({ ...prev, authVersion: prev.authVersion + 1 }))
187
- }
188
- if (pollTimer) clearInterval(pollTimer)
189
- }
190
- } catch (error) {
191
- console.error('Error checking OpenRouter cache:', error)
192
- if (pollTimer) clearInterval(pollTimer)
193
- }
194
- }, 500)
195
 
196
- // Stop polling after 10 seconds
197
- setTimeout(() => {
198
- if (pollTimer && mounted) {
199
- clearInterval(pollTimer)
200
- pollTimer = null
201
- }
202
- }, 10000)
203
- }
204
- } catch (error) {
205
- console.error('Error checking API provider:', error)
206
- }
207
  }
 
208
 
209
- checkOpenRouterCache()
210
-
211
- return () => {
212
- mounted = false
213
- if (pollTimer) clearInterval(pollTimer)
 
 
 
214
  }
215
- }, [model, setAppState])
 
 
 
 
 
 
 
 
216
  const {
217
  version,
218
  cwd,
219
  billingType,
220
- agentName: agentNameFromSettings
221
- } = getLogoDisplayData();
222
- const agentName = agent ?? agentNameFromSettings;
223
- const effortSuffix = getEffortSuffix(model, effortValue);
224
- const t9 = fullModelDisplayName + effortSuffix;
225
- let t10;
226
- if ($[13] !== t9) {
227
- t10 = truncate(t9, LEFT_PANEL_MAX_WIDTH - 20);
228
- $[13] = t9;
229
- $[14] = t10;
230
- } else {
231
- t10 = $[14];
232
- }
233
- const modelDisplayName = t10;
234
- if (!hasReleaseNotes && !showOnboarding && !isEnvTruthy(process.env.CLAUDE_CODE_FORCE_FULL_LOGO)) {
235
- let t11;
236
- let t12;
237
- let t13;
238
- let t14;
239
- let t15;
240
- let t16;
241
- let t17;
242
- if ($[15] === Symbol.for("react.memo_cache_sentinel")) {
243
- t11 = <CondensedLogo />;
244
- t12 = <VoiceModeNotice />;
245
- t13 = <Opus1mMergeNotice />;
246
- t14 = ChannelsNoticeModule && <ChannelsNoticeModule.ChannelsNotice />;
247
- t15 = isDebugMode() && <Box paddingLeft={2} flexDirection="column"><Text color="warning">Debug mode enabled</Text><Text dimColor={true}>Logging to: {isDebugToStdErr() ? "stderr" : getDebugLogPath()}</Text></Box>;
248
- t16 = <EmergencyTip />;
249
- t17 = process.env.CLAUDE_CODE_TMUX_SESSION && <Box paddingLeft={2} flexDirection="column"><Text dimColor={true}>tmux session: {process.env.CLAUDE_CODE_TMUX_SESSION}</Text><Text dimColor={true}>{process.env.CLAUDE_CODE_TMUX_PREFIX_CONFLICTS ? `Detach: ${process.env.CLAUDE_CODE_TMUX_PREFIX} ${process.env.CLAUDE_CODE_TMUX_PREFIX} d (press prefix twice - Claude uses ${process.env.CLAUDE_CODE_TMUX_PREFIX})` : `Detach: ${process.env.CLAUDE_CODE_TMUX_PREFIX} d`}</Text></Box>;
250
- $[15] = t11;
251
- $[16] = t12;
252
- $[17] = t13;
253
- $[18] = t14;
254
- $[19] = t15;
255
- $[20] = t16;
256
- $[21] = t17;
257
- } else {
258
- t11 = $[15];
259
- t12 = $[16];
260
- t13 = $[17];
261
- t14 = $[18];
262
- t15 = $[19];
263
- t16 = $[20];
264
- t17 = $[21];
265
- }
266
- let t18;
267
- if ($[22] !== announcement || $[23] !== config) {
268
- t18 = announcement && <Box paddingLeft={2} flexDirection="column">{!process.env.IS_DEMO && config.oauthAccount?.organizationName && <Text dimColor={true}>Message from {config.oauthAccount.organizationName}:</Text>}<Text>{announcement}</Text></Box>;
269
- $[22] = announcement;
270
- $[23] = config;
271
- $[24] = t18;
272
- } else {
273
- t18 = $[24];
274
- }
275
- let t19;
276
- let t20;
277
- let t21;
278
- let t22;
279
- if ($[25] === Symbol.for("react.memo_cache_sentinel")) {
280
- t19 = false && !process.env.DEMO_VERSION && <Box paddingLeft={2} flexDirection="column"><Text dimColor={true}>Use /issue to report model behavior issues</Text></Box>;
281
- t20 = false && !process.env.DEMO_VERSION && <Box paddingLeft={2} flexDirection="column"><Text color="warning">[ANT-ONLY] Logs:</Text><Text dimColor={true}>API calls: {getDisplayPath(getDumpPromptsPath())}</Text><Text dimColor={true}>Debug logs: {getDisplayPath(getDebugLogPath())}</Text>{isDetailedProfilingEnabled() && <Text dimColor={true}>Startup Perf: {getDisplayPath(getStartupPerfLogPath())}</Text>}</Box>;
282
- t21 = false && <GateOverridesWarning />;
283
- t22 = false && <ExperimentEnrollmentNotice />;
284
- $[25] = t19;
285
- $[26] = t20;
286
- $[27] = t21;
287
- $[28] = t22;
288
- } else {
289
- t19 = $[25];
290
- t20 = $[26];
291
- t21 = $[27];
292
- t22 = $[28];
293
- }
294
- let t23;
295
- if ($[29] !== t18) {
296
- t23 = <>{t11}{t12}{t13}{t14}{t15}{t16}{t17}{t18}{t19}{t20}{t21}{t22}</>;
297
- $[29] = t18;
298
- $[30] = t23;
299
- } else {
300
- t23 = $[30];
301
- }
302
- return t23;
303
  }
304
- const layoutMode = getLayoutMode(columns);
305
- const userTheme = resolveThemeSetting(getGlobalConfig().theme);
306
- const borderTitle = ` ${color("startupAccent", userTheme)("VersperClaw")} ${color("inactive", userTheme)(`v${version}`)} `;
307
- const compactBorderTitle = color("startupAccent", userTheme)(" VersperClaw ");
308
- if (layoutMode === "compact") {
309
- let welcomeMessage = formatWelcomeMessage(username);
310
- if (stringWidth(welcomeMessage) > columns - 4) {
311
- let t11;
312
- if ($[31] === Symbol.for("react.memo_cache_sentinel")) {
313
- t11 = formatWelcomeMessage(null);
314
- $[31] = t11;
315
- } else {
316
- t11 = $[31];
317
- }
318
- welcomeMessage = t11;
319
- }
320
- const cwdAvailableWidth = agentName ? columns - 4 - 1 - stringWidth(agentName) - 3 : columns - 4;
321
- const truncatedCwd = truncatePath(cwd, Math.max(cwdAvailableWidth, 10));
322
- let t11;
323
- if ($[32] !== compactBorderTitle) {
324
- t11 = {
325
- content: compactBorderTitle,
326
- position: "top",
327
- align: "start",
328
- offset: 1
329
- };
330
- $[32] = compactBorderTitle;
331
- $[33] = t11;
332
- } else {
333
- t11 = $[33];
334
- }
335
- let t12;
336
- if ($[34] === Symbol.for("react.memo_cache_sentinel")) {
337
- t12 = <Box marginY={1}><Clawd /></Box>;
338
- $[34] = t12;
339
- } else {
340
- t12 = $[34];
341
- }
342
- let t13;
343
- if ($[35] !== modelDisplayName) {
344
- t13 = <Text dimColor={true}>{modelDisplayName}</Text>;
345
- $[35] = modelDisplayName;
346
- $[36] = t13;
347
- } else {
348
- t13 = $[36];
349
- }
350
- let t14;
351
- let t15;
352
- let t16;
353
- if ($[37] === Symbol.for("react.memo_cache_sentinel")) {
354
- t14 = <VoiceModeNotice />;
355
- t15 = <Opus1mMergeNotice />;
356
- t16 = ChannelsNoticeModule && <ChannelsNoticeModule.ChannelsNotice />;
357
- $[37] = t14;
358
- $[38] = t15;
359
- $[39] = t16;
360
- } else {
361
- t14 = $[37];
362
- t15 = $[38];
363
- t16 = $[39];
364
- }
365
- let t17;
366
- if ($[40] !== showSandboxStatus) {
367
- t17 = showSandboxStatus && <Box marginTop={1} flexDirection="column"><Text color="warning">Your bash commands will be sandboxed. Disable with /sandbox.</Text></Box>;
368
- $[40] = showSandboxStatus;
369
- $[41] = t17;
370
- } else {
371
- t17 = $[41];
372
- }
373
- let t18;
374
- let t19;
375
- if ($[42] === Symbol.for("react.memo_cache_sentinel")) {
376
- t18 = false && <GateOverridesWarning />;
377
- t19 = false && <ExperimentEnrollmentNotice />;
378
- $[42] = t18;
379
- $[43] = t19;
380
- } else {
381
- t18 = $[42];
382
- t19 = $[43];
383
  }
384
- return <><OffscreenFreeze><Box flexDirection="column" borderStyle="round" borderColor="startupAccent" borderText={t11} paddingX={1} paddingY={1} alignItems="center" width={columns}><Text bold={true}>{welcomeMessage}</Text>{t12}{t13}<Text dimColor={true}>{billingType}</Text><Text dimColor={true}>{agentName ? `@${agentName} Β· ${truncatedCwd}` : truncatedCwd}</Text></Box></OffscreenFreeze>{t14}{t15}{t16}{t17}{t18}{t19}</>;
385
- }
386
- const welcomeMessage_0 = formatWelcomeMessage(username);
387
- const modelLine = !process.env.IS_DEMO && config.oauthAccount?.organizationName ? `${modelDisplayName} Β· ${billingType} Β· ${config.oauthAccount.organizationName}` : `${modelDisplayName} Β· ${billingType}`;
388
- const cwdAvailableWidth_0 = agentName ? LEFT_PANEL_MAX_WIDTH - 1 - stringWidth(agentName) - 3 : LEFT_PANEL_MAX_WIDTH;
389
- const truncatedCwd_0 = truncatePath(cwd, Math.max(cwdAvailableWidth_0, 10));
390
- const cwdLine = agentName ? `@${agentName} Β· ${truncatedCwd_0}` : truncatedCwd_0;
391
- const optimalLeftWidth = calculateOptimalLeftWidth(welcomeMessage_0, cwdLine, modelLine);
392
- const {
393
- leftWidth,
394
- rightWidth
395
- } = calculateLayoutDimensions(columns, layoutMode, optimalLeftWidth);
396
- const T0 = OffscreenFreeze;
397
- const T1 = Box;
398
- const t11 = "column";
399
- const t12 = "round";
400
- const t13 = "startupAccent";
401
- let t14;
402
- if ($[44] !== borderTitle) {
403
- t14 = {
404
- content: borderTitle,
405
- position: "top",
406
- align: "start",
407
- offset: 3
408
- };
409
- $[44] = borderTitle;
410
- $[45] = t14;
411
- } else {
412
- t14 = $[45];
413
- }
414
- const T2 = Box;
415
- const t15 = layoutMode === "horizontal" ? "row" : "column";
416
- const t16 = 1;
417
- const t17 = 1;
418
- let t18;
419
- if ($[46] !== welcomeMessage_0) {
420
- t18 = <Box marginTop={1}><Text bold={true}>{welcomeMessage_0}</Text></Box>;
421
- $[46] = welcomeMessage_0;
422
- $[47] = t18;
423
- } else {
424
- t18 = $[47];
425
- }
426
- let t19;
427
- if ($[48] === Symbol.for("react.memo_cache_sentinel")) {
428
- t19 = <Clawd />;
429
- $[48] = t19;
430
- } else {
431
- t19 = $[48];
432
- }
433
- let t20;
434
- if ($[49] !== modelLine) {
435
- t20 = <Text dimColor={true}>{modelLine}</Text>;
436
- $[49] = modelLine;
437
- $[50] = t20;
438
- } else {
439
- t20 = $[50];
440
- }
441
- let t21;
442
- if ($[51] !== cwdLine) {
443
- t21 = <Text dimColor={true}>{cwdLine}</Text>;
444
- $[51] = cwdLine;
445
- $[52] = t21;
446
- } else {
447
- t21 = $[52];
448
- }
449
- let t22;
450
- if ($[53] !== t20 || $[54] !== t21) {
451
- t22 = <Box flexDirection="column" alignItems="center">{t20}{t21}</Box>;
452
- $[53] = t20;
453
- $[54] = t21;
454
- $[55] = t22;
455
- } else {
456
- t22 = $[55];
457
- }
458
- let t23;
459
- if ($[56] !== leftWidth || $[57] !== t18 || $[58] !== t22) {
460
- t23 = <Box flexDirection="column" width={leftWidth} justifyContent="space-between" alignItems="center" minHeight={9}>{t18}{t19}{t22}</Box>;
461
- $[56] = leftWidth;
462
- $[57] = t18;
463
- $[58] = t22;
464
- $[59] = t23;
465
- } else {
466
- t23 = $[59];
467
- }
468
- let t24;
469
- if ($[60] !== layoutMode) {
470
- t24 = layoutMode === "horizontal" && <Box height="100%" borderStyle="single" borderColor="startupAccent" borderDimColor={true} borderTop={false} borderBottom={false} borderLeft={false} />;
471
- $[60] = layoutMode;
472
- $[61] = t24;
473
- } else {
474
- t24 = $[61];
475
- }
476
- const t25 = layoutMode === "horizontal" && <FeedColumn feeds={showOnboarding ? [createProjectOnboardingFeed(getSteps()), createRecentActivityFeed(activities)] : showGuestPassesUpsell ? [createRecentActivityFeed(activities), createGuestPassesFeed()] : showOverageCreditUpsell ? [createRecentActivityFeed(activities), createOverageCreditFeed()] : [createRecentActivityFeed(activities), createWhatsNewFeed(changelog)]} maxWidth={rightWidth} />;
477
- let t26;
478
- if ($[62] !== T2 || $[63] !== t15 || $[64] !== t23 || $[65] !== t24 || $[66] !== t25) {
479
- t26 = <T2 flexDirection={t15} paddingX={t16} gap={t17}>{t23}{t24}{t25}</T2>;
480
- $[62] = T2;
481
- $[63] = t15;
482
- $[64] = t23;
483
- $[65] = t24;
484
- $[66] = t25;
485
- $[67] = t26;
486
- } else {
487
- t26 = $[67];
488
- }
489
- let t27;
490
- if ($[68] !== T1 || $[69] !== t14 || $[70] !== t26) {
491
- t27 = <T1 flexDirection={t11} borderStyle={t12} borderColor={t13} borderText={t14}>{t26}</T1>;
492
- $[68] = T1;
493
- $[69] = t14;
494
- $[70] = t26;
495
- $[71] = t27;
496
- } else {
497
- t27 = $[71];
498
- }
499
- let t28;
500
- if ($[72] !== T0 || $[73] !== t27) {
501
- t28 = <T0>{t27}</T0>;
502
- $[72] = T0;
503
- $[73] = t27;
504
- $[74] = t28;
505
- } else {
506
- t28 = $[74];
507
- }
508
- let t29;
509
- let t30;
510
- let t31;
511
- let t32;
512
- let t33;
513
- let t34;
514
- if ($[75] === Symbol.for("react.memo_cache_sentinel")) {
515
- t29 = <VoiceModeNotice />;
516
- t30 = <Opus1mMergeNotice />;
517
- t31 = ChannelsNoticeModule && <ChannelsNoticeModule.ChannelsNotice />;
518
- t32 = isDebugMode() && <Box paddingLeft={2} flexDirection="column"><Text color="warning">Debug mode enabled</Text><Text dimColor={true}>Logging to: {isDebugToStdErr() ? "stderr" : getDebugLogPath()}</Text></Box>;
519
- t33 = <EmergencyTip />;
520
- t34 = process.env.CLAUDE_CODE_TMUX_SESSION && <Box paddingLeft={2} flexDirection="column"><Text dimColor={true}>tmux session: {process.env.CLAUDE_CODE_TMUX_SESSION}</Text><Text dimColor={true}>{process.env.CLAUDE_CODE_TMUX_PREFIX_CONFLICTS ? `Detach: ${process.env.CLAUDE_CODE_TMUX_PREFIX} ${process.env.CLAUDE_CODE_TMUX_PREFIX} d (press prefix twice - Claude uses ${process.env.CLAUDE_CODE_TMUX_PREFIX})` : `Detach: ${process.env.CLAUDE_CODE_TMUX_PREFIX} d`}</Text></Box>;
521
- $[75] = t29;
522
- $[76] = t30;
523
- $[77] = t31;
524
- $[78] = t32;
525
- $[79] = t33;
526
- $[80] = t34;
527
- } else {
528
- t29 = $[75];
529
- t30 = $[76];
530
- t31 = $[77];
531
- t32 = $[78];
532
- t33 = $[79];
533
- t34 = $[80];
534
- }
535
- let t35;
536
- if ($[81] !== announcement || $[82] !== config) {
537
- t35 = announcement && <Box paddingLeft={2} flexDirection="column">{!process.env.IS_DEMO && config.oauthAccount?.organizationName && <Text dimColor={true}>Message from {config.oauthAccount.organizationName}:</Text>}<Text>{announcement}</Text></Box>;
538
- $[81] = announcement;
539
- $[82] = config;
540
- $[83] = t35;
541
- } else {
542
- t35 = $[83];
543
- }
544
- let t36;
545
- if ($[84] !== showSandboxStatus) {
546
- t36 = showSandboxStatus && <Box paddingLeft={2} flexDirection="column"><Text color="warning">Your bash commands will be sandboxed. Disable with /sandbox.</Text></Box>;
547
- $[84] = showSandboxStatus;
548
- $[85] = t36;
549
- } else {
550
- t36 = $[85];
551
- }
552
- let t37;
553
- let t38;
554
- let t39;
555
- let t40;
556
- if ($[86] === Symbol.for("react.memo_cache_sentinel")) {
557
- t37 = false && !process.env.DEMO_VERSION && <Box paddingLeft={2} flexDirection="column"><Text dimColor={true}>Use /issue to report model behavior issues</Text></Box>;
558
- t38 = false && !process.env.DEMO_VERSION && <Box paddingLeft={2} flexDirection="column"><Text color="warning">[ANT-ONLY] Logs:</Text><Text dimColor={true}>API calls: {getDisplayPath(getDumpPromptsPath())}</Text><Text dimColor={true}>Debug logs: {getDisplayPath(getDebugLogPath())}</Text>{isDetailedProfilingEnabled() && <Text dimColor={true}>Startup Perf: {getDisplayPath(getStartupPerfLogPath())}</Text>}</Box>;
559
- t39 = false && <GateOverridesWarning />;
560
- t40 = false && <ExperimentEnrollmentNotice />;
561
- $[86] = t37;
562
- $[87] = t38;
563
- $[88] = t39;
564
- $[89] = t40;
565
- } else {
566
- t37 = $[86];
567
- t38 = $[87];
568
- t39 = $[88];
569
- t40 = $[89];
570
- }
571
- let t41;
572
- if ($[90] !== t28 || $[91] !== t35 || $[92] !== t36) {
573
- t41 = <>{t28}{t29}{t30}{t31}{t32}{t33}{t34}{t35}{t36}{t37}{t38}{t39}{t40}</>;
574
- $[90] = t28;
575
- $[91] = t35;
576
- $[92] = t36;
577
- $[93] = t41;
578
- } else {
579
- t41 = $[93];
580
- }
581
- return t41;
582
- }
583
- function _temp3(current) {
584
- if (current.lastReleaseNotesSeen === MACRO.VERSION) {
585
- return current;
586
  }
587
- return {
588
- ...current,
589
- lastReleaseNotesSeen: MACRO.VERSION
590
- };
591
- }
592
- function _temp2(s_0) {
593
- return s_0.effortValue;
594
- }
595
- function _temp(s) {
596
- return s.agent;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
597
  }
598
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIkJveCIsIlRleHQiLCJjb2xvciIsInVzZVRlcm1pbmFsU2l6ZSIsInN0cmluZ1dpZHRoIiwiZ2V0TGF5b3V0TW9kZSIsImNhbGN1bGF0ZUxheW91dERpbWVuc2lvbnMiLCJjYWxjdWxhdGVPcHRpbWFsTGVmdFdpZHRoIiwiZm9ybWF0V2VsY29tZU1lc3NhZ2UiLCJ0cnVuY2F0ZVBhdGgiLCJnZXRSZWNlbnRBY3Rpdml0eVN5bmMiLCJnZXRSZWNlbnRSZWxlYXNlTm90ZXNTeW5jIiwiZ2V0TG9nb0Rpc3BsYXlEYXRhIiwidHJ1bmNhdGUiLCJnZXREaXNwbGF5UGF0aCIsIkNsYXdkIiwiRmVlZENvbHVtbiIsImNyZWF0ZVJlY2VudEFjdGl2aXR5RmVlZCIsImNyZWF0ZVdoYXRzTmV3RmVlZCIsImNyZWF0ZVByb2plY3RPbmJvYXJkaW5nRmVlZCIsImNyZWF0ZUd1ZXN0UGFzc2VzRmVlZCIsImdldEdsb2JhbENvbmZpZyIsInNhdmVHbG9iYWxDb25maWciLCJyZXNvbHZlVGhlbWVTZXR0aW5nIiwiZ2V0SW5pdGlhbFNldHRpbmdzIiwiaXNEZWJ1Z01vZGUiLCJpc0RlYnVnVG9TdGRFcnIiLCJnZXREZWJ1Z0xvZ1BhdGgiLCJ1c2VFZmZlY3QiLCJ1c2VTdGF0ZSIsImdldFN0ZXBzIiwic2hvdWxkU2hvd1Byb2plY3RPbmJvYXJkaW5nIiwiaW5jcmVtZW50UHJvamVjdE9uYm9hcmRpbmdTZWVuQ291bnQiLCJDb25kZW5zZWRMb2dvIiwiT2Zmc2NyZWVuRnJlZXplIiwiY2hlY2tGb3JSZWxlYXNlTm90ZXNTeW5jIiwiZ2V0RHVtcFByb21wdHNQYXRoIiwiaXNFbnZUcnV0aHkiLCJnZXRTdGFydHVwUGVyZkxvZ1BhdGgiLCJpc0RldGFpbGVkUHJvZmlsaW5nRW5hYmxlZCIsIkVtZXJnZW5jeVRpcCIsIlZvaWNlTW9kZU5vdGljZSIsIk9wdXMxbU1lcmdlTm90aWNlIiwiZmVhdHVyZSIsIkNoYW5uZWxzTm90aWNlTW9kdWxlIiwicmVxdWlyZSIsIlNhbmRib3hNYW5hZ2VyIiwidXNlU2hvd0d1ZXN0UGFzc2VzVXBzZWxsIiwiaW5jcmVtZW50R3Vlc3RQYXNzZXNTZWVuQ291bnQiLCJ1c2VTaG93T3ZlcmFnZUNyZWRpdFVwc2VsbCIsImluY3JlbWVudE92ZXJhZ2VDcmVkaXRVcHNlbGxTZWVuQ291bnQiLCJjcmVhdGVPdmVyYWdlQ3JlZGl0RmVlZCIsInBsdXJhbCIsInVzZUFwcFN0YXRlIiwiZ2V0RWZmb3J0U3VmZml4IiwidXNlTWFpbkxvb3BNb2RlbCIsInJlbmRlck1vZGVsU2V0dGluZyIsIkxFRlRfUEFORUxfTUFYX1dJRFRIIiwiTG9nb1YyIiwiJCIsIl9jIiwiYWN0aXZpdGllcyIsInVzZXJuYW1lIiwib2F1dGhBY2NvdW50IiwiZGlzcGxheU5hbWUiLCJjb2x1bW5zIiwidDAiLCJTeW1ib2wiLCJmb3IiLCJzaG93T25ib2FyZGluZyIsInQxIiwiaXNTYW5kYm94aW5nRW5hYmxlZCIsInNob3dTYW5kYm94U3RhdHVzIiwic2hvd0d1ZXN0UGFzc2VzVXBzZWxsIiwic2hvd092ZXJhZ2VDcmVkaXRVcHNlbGwiLCJhZ2VudCIsIl90ZW1wIiwiZWZmb3J0VmFsdWUiLCJfdGVtcDIiLCJjb25maWciLCJjaGFuZ2Vsb2ciLCJhbm5vdW5jZW1lbnQiLCJhbm5vdW5jZW1lbnRzIiwiY29tcGFueUFubm91bmNlbWVudHMiLCJsZW5ndGgiLCJudW1TdGFydHVwcyIsIk1hdGgiLCJmbG9vciIsInJhbmRvbSIsImhhc1JlbGVhc2VOb3RlcyIsImxhc3RSZWxlYXNlTm90ZXNTZWVuIiwidDIiLCJjdXJyZW50Q29uZmlnIiwiTUFDUk8iLCJWRVJTSU9OIiwiX3RlbXAzIiwidDMiLCJ0NCIsInByb2Nlc3MiLCJlbnYiLCJDTEFVREVfQ09ERV9GT1JDRV9GVUxMX0xPR08iLCJpc0NvbmRlbnNlZE1vZGUiLCJ0NSIsInQ2IiwidDciLCJ0OCIsIm1vZGVsIiwiZnVsbE1vZGVsRGlzcGxheU5hbWUiLCJ2ZXJzaW9uIiwiY3dkIiwiYmlsbGluZ1R5cGUiLCJhZ2VudE5hbWUiLCJhZ2VudE5hbWVGcm9tU2V0dGluZ3MiLCJlZmZvcnRTdWZmaXgiLCJ0OSIsInQxMCIsIm1vZGVsRGlzcGxheU5hbWUiLCJ0MTEiLCJ0MTIiLCJ0MTMiLCJ0MTQiLCJ0MTUiLCJ0MTYiLCJ0MTciLCJDTEFVREVfQ09ERV9UTVVYX1NFU1NJT04iLCJDTEFVREVfQ09ERV9UTVVYX1BSRUZJWF9DT05GTElDVFMiLCJDTEFVREVfQ09ERV9UTVVYX1BSRUZJWCIsInQxOCIsIklTX0RFTU8iLCJvcmdhbml6YXRpb25OYW1lIiwidDE5IiwidDIwIiwidDIxIiwidDIyIiwiREVNT19WRVJTSU9OIiwidDIzIiwibGF5b3V0TW9kZSIsInVzZXJUaGVtZSIsInRoZW1lIiwiYm9yZGVyVGl0bGUiLCJjb21wYWN0Qm9yZGVyVGl0bGUiLCJ3ZWxjb21lTWVzc2FnZSIsImN3ZEF2YWlsYWJsZVdpZHRoIiwidHJ1bmNhdGVkQ3dkIiwibWF4IiwiY29udGVudCIsInBvc2l0aW9uIiwiYWxpZ24iLCJvZmZzZXQiLCJ3ZWxjb21lTWVzc2FnZV8wIiwibW9kZWxMaW5lIiwiY3dkQXZhaWxhYmxlV2lkdGhfMCIsInRydW5jYXRlZEN3ZF8wIiwiY3dkTGluZSIsIm9wdGltYWxMZWZ0V2lkdGgiLCJsZWZ0V2lkdGgiLCJyaWdodFdpZHRoIiwiVDAiLCJUMSIsIlQyIiwidDI0IiwidDI1IiwidDI2IiwidDI3IiwidDI4IiwidDI5IiwidDMwIiwidDMxIiwidDMyIiwidDMzIiwidDM0IiwidDM1IiwidDM2IiwidDM3IiwidDM4IiwidDM5IiwidDQwIiwidDQxIiwiY3VycmVudCIsInNfMCIsInMiXSwic291cmNlcyI6WyJMb2dvVjIudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIGJpb21lLWlnbm9yZS1hbGwgYXNzaXN0L3NvdXJjZS9vcmdhbml6ZUltcG9ydHM6IEFOVC1PTkxZIGltcG9ydCBtYXJrZXJzIG11c3Qgbm90IGJlIHJlb3JkZXJlZFxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBCb3gsIFRleHQsIGNvbG9yIH0gZnJvbSAnLi4vLi4vaW5rLmpzJ1xuaW1wb3J0IHsgdXNlVGVybWluYWxTaXplIH0gZnJvbSAnLi4vLi4vaG9va3MvdXNlVGVybWluYWxTaXplLmpzJ1xuaW1wb3J0IHsgc3RyaW5nV2lkdGggfSBmcm9tICcuLi8uLi9pbmsvc3RyaW5nV2lkdGguanMnXG5pbXBvcnQge1xuICBnZXRMYXlvdXRNb2RlLFxuICBjYWxjdWxhdGVMYXlvdXREaW1lbnNpb25zLFxuICBjYWxjdWxhdGVPcHRpbWFsTGVmdFdpZHRoLFxuICBmb3JtYXRXZWxjb21lTWVzc2FnZSxcbiAgdHJ1bmNhdGVQYXRoLFxuICBnZXRSZWNlbnRBY3Rpdml0eVN5bmMsXG4gIGdldFJlY2VudFJlbGVhc2VOb3Rlc1N5bmMsXG4gIGdldExvZ29EaXNwbGF5RGF0YSxcbn0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nb1YyVXRpbHMuanMnXG5pbXBvcnQgeyB0cnVuY2F0ZSB9IGZyb20gJy4uLy4uL3V0aWxzL2Zvcm1hdC5qcydcbmltcG9ydCB7IGdldERpc3BsYXlQYXRoIH0gZnJvbSAnLi4vLi4vdXRpbHMvZmlsZS5qcydcbmltcG9ydCB7IENsYXdkIH0gZnJvbSAnLi9DbGF3ZC5qcydcbmltcG9ydCB7IEZlZWRDb2x1bW4gfSBmcm9tICcuL0ZlZWRDb2x1bW4uanMnXG5pbXBvcnQge1xuICBjcmVhdGVSZWNlbnRBY3Rpdml0eUZlZWQsXG4gIGNyZWF0ZVdoYXRzTmV3RmVlZCxcbiAgY3JlYXRlUHJvamVjdE9uYm9hcmRpbmdGZWVkLFxuICBjcmVhdGVHdWVzdFBhc3Nlc0ZlZWQsXG59IGZyb20gJy4vZmVlZENvbmZpZ3MuanMnXG5pbXBvcnQgeyBnZXRHbG9iYWxDb25maWcsIHNhdmVHbG9iYWxDb25maWcgfSBmcm9tICdzcmMvdXRpbHMvY29uZmlnLmpzJ1xuaW1wb3J0IHsgcmVzb2x2ZVRoZW1lU2V0dGluZyB9IGZyb20gJ3NyYy91dGlscy9zeXN0ZW1UaGVtZS5qcydcbmltcG9ydCB7IGdldEluaXRpYWxTZXR0aW5ncyB9IGZyb20gJ3NyYy91dGlscy9zZXR0aW5ncy9zZXR0aW5ncy5qcydcbmltcG9ydCB7XG4gIGlzRGVidWdNb2RlLFxuICBpc0RlYnVnVG9TdGRFcnIsXG4gIGdldERlYnVnTG9nUGF0aCxcbn0gZnJvbSAnc3JjL3V0aWxzL2RlYnVnLmpzJ1xuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHtcbiAgZ2V0U3RlcHMsXG4gIHNob3VsZFNob3dQcm9qZWN0T25ib2FyZGluZyxcbiAgaW5jcmVtZW50UHJvamVjdE9uYm9hcmRpbmdTZWVuQ291bnQsXG59IGZyb20gJy4uLy4uL3Byb2plY3RPbmJvYXJkaW5nU3RhdGUuanMnXG5pbXBvcnQgeyBDb25kZW5zZWRMb2dvIH0gZnJvbSAnLi9Db25kZW5zZWRMb2dvLmpzJ1xuaW1wb3J0IHsgT2Zmc2NyZWVuRnJlZXplIH0gZnJvbSAnLi4vT2Zmc2NyZWVuRnJlZXplLmpzJ1xuaW1wb3J0IHsgY2hlY2tGb3JSZWxlYXNlTm90ZXNTeW5jIH0gZnJvbSAnLi4vLi4vdXRpbHMvcmVsZWFzZU5vdGVzLmpzJ1xuaW1wb3J0IHsgZ2V0RHVtcFByb21wdHNQYXRoIH0gZnJvbSAnc3JjL3NlcnZpY2VzL2FwaS9kdW1wUHJvbXB0cy5qcydcbmltcG9ydCB7IGlzRW52VHJ1dGh5IH0gZnJvbSAnc3JjL3V0aWxzL2VudlV0aWxzLmpzJ1xuaW1wb3J0IHtcbiAgZ2V0U3RhcnR1cFBlcmZMb2dQYXRoLFxuICBpc0RldGFpbGVkUHJvZmlsaW5nRW5hYmxlZCxcbn0gZnJvbSAnc3JjL3V0aWxzL3N0YXJ0dXBQcm9maWxlci5qcydcbmltcG9ydCB7IEVtZXJnZW5jeVRpcCB9IGZyb20gJy4vRW1lcmdlbmN5VGlwLmpzJ1xuaW1wb3J0IHsgVm9pY2VNb2RlTm90aWNlIH0gZnJvbSAnLi9Wb2ljZU1vZGVOb3RpY2UuanMnXG5pbXBvcnQgeyBPcHVzMW1NZXJnZU5vdGljZSB9IGZyb20gJy4vT3B1czFtTWVyZ2VOb3RpY2UuanMnXG5pbXBvcnQgeyBmZWF0dXJlIH0gZnJvbSAnYnVuOmJ1bmRsZSdcblxuLy8gQ29uZGl0aW9uYWwgcmVxdWlyZSBzbyBDaGFubmVsc05vdGljZS50c3ggdHJlZS1zaGFrZXMgd2hlbiBib3RoIGZsYWdzIGFyZVxuLy8gZmFsc2UuIEEgbW9kdWxlLXNjb3BlIGhlbHBlciBjb21wb25lbnQgaW5zaWRlIGEgZmVhdHVyZSgpIHRlcm5hcnkgZG9lcyBOT1Rcbi8vIHRyZWUtc2hha2UgKGRvY3MvZmVhdHVyZS1nYXRpbmcubWQpOyB0aGUgcmVxdWlyZSBwYXR0ZXJuIGVsaW1pbmF0ZXMgdGhlXG4vLyB3aG9sZSBmaWxlLiBWb2ljZU1vZGVOb3RpY2UgdXNlcyB0aGUgdW5zYWZlIGhlbHBlciBwYXR0ZXJuIGJ1dCBWT0lDRV9NT0RFXG4vLyBpcyBleHRlcm5hbDogdHJ1ZSBzbyBpdCdzIG1vb3QgdGhlcmUuXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzICovXG5jb25zdCBDaGFubmVsc05vdGljZU1vZHVsZSA9XG4gIGZlYXR1cmUoJ0tBSVJPUycpIHx8IGZlYXR1cmUoJ0tBSVJPU19DSEFOTkVMUycpXG4gICAgPyAocmVxdWlyZSgnLi9DaGFubmVsc05vdGljZS5qcycpIGFzIHR5cGVvZiBpbXBvcnQoJy4vQ2hhbm5lbHNOb3RpY2UuanMnKSlcbiAgICA6IG51bGxcbi8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0cyAqL1xuaW1wb3J0IHsgU2FuZGJveE1hbmFnZXIgfSBmcm9tICdzcmMvdXRpbHMvc2FuZGJveC9zYW5kYm94LWFkYXB0ZXIuanMnXG5pbXBvcnQge1xuICB1c2VTaG93R3Vlc3RQYXNzZXNVcHNlbGwsXG4gIGluY3JlbWVudEd1ZXN0UGFzc2VzU2VlbkNvdW50LFxufSBmcm9tICcuL0d1ZXN0UGFzc2VzVXBzZWxsLmpzJ1xuaW1wb3J0IHtcbiAgdXNlU2hvd092ZXJhZ2VDcmVkaXRVcHNlbGwsXG4gIGluY3JlbWVudE92ZXJhZ2VDcmVkaXRVcHNlbGxTZWVuQ291bnQsXG4gIGNyZWF0ZU92ZXJhZ2VDcmVkaXRGZWVkLFxufSBmcm9tICcuL092ZXJhZ2VDcmVkaXRVcHNlbGwuanMnXG5pbXBvcnQgeyBwbHVyYWwgfSBmcm9tICcuLi8uLi91dGlscy9zdHJpbmdVdGlscy5qcydcbmltcG9ydCB7IHVzZUFwcFN0YXRlIH0gZnJvbSAnLi4vLi4vc3RhdGUvQXBwU3RhdGUuanMnXG5pbXBvcnQgeyBnZXRFZmZvcnRTdWZmaXggfSBmcm9tICcuLi8uLi91dGlscy9lZmZvcnQuanMnXG5pbXBvcnQgeyB1c2VNYWluTG9vcE1vZGVsIH0gZnJvbSAnLi4vLi4vaG9va3MvdXNlTWFpbkxvb3BNb2RlbC5qcydcbmltcG9ydCB7IHJlbmRlck1vZGVsU2V0dGluZyB9IGZyb20gJy4uLy4uL3V0aWxzL21vZGVsL21vZGVsLmpzJ1xuXG5jb25zdCBMRUZUX1BBTkVMX01BWF9XSURUSCA9IDUwXG5cbmV4cG9ydCBmdW5jdGlvbiBMb2dvVjIoKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgY29uc3QgYWN0aXZpdGllcyA9IGdldFJlY2VudEFjdGl2aXR5U3luYygpXG4gIGNvbnN0IHVzZXJuYW1lID0gZ2V0R2xvYmFsQ29uZmlnKCkub2F1dGhBY2NvdW50Py5kaXNwbGF5TmFtZSA/PyAnJ1xuXG4gIGNvbnN0IHsgY29sdW1ucyB9ID0gdXNlVGVybWluYWxTaXplKClcbiAgY29uc3Qgc2hvd09uYm9hcmRpbmcgPSBzaG91bGRTaG93UHJvamVjdE9uYm9hcmRpbmcoKVxuICBjb25zdCBzaG93U2FuZGJveFN0YXR1cyA9IFNhbmRib3hNYW5hZ2VyLmlzU2FuZGJveGluZ0VuYWJsZWQoKVxuICBjb25zdCBzaG93R3Vlc3RQYXNzZXNVcHNlbGwgPSB1c2VTaG93R3Vlc3RQYXNzZXNVcHNlbGwoKVxuICBjb25zdCBzaG93T3ZlcmFnZUNyZWRpdFVwc2VsbCA9IHVzZVNob3dPdmVyYWdlQ3JlZGl0VXBzZWxsKClcbiAgY29uc3QgYWdlbnQgPSB1c2VBcHBTdGF0ZShzID0+IHMuYWdlbnQpXG4gIGNvbnN0IGVmZm9ydFZhbHVlID0gdXNlQXBwU3RhdGUocyA9PiBzLmVmZm9ydFZhbHVlKVxuXG4gIGNvbnN0IGNvbmZpZyA9IGdldEdsb2JhbENvbmZpZygpXG5cbiAgbGV0IGNoYW5nZWxvZzogc3RyaW5nW11cbiAgdHJ5IHtcbiAgICBjaGFuZ2Vsb2cgPSBnZXRSZWNlbnRSZWxlYXNlTm90ZXNTeW5jKDMpXG4gIH0gY2F0Y2gge1xuICAgIGNoYW5nZWxvZyA9IFtdXG4gIH1cblxuICAvLyBHZXQgY29tcGFueSBhbm5vdW5jZW1lbnRzIGFuZCBzZWxlY3Qgb25lOlxuICAvLyAtIEZpcnN0IHN0YXJ0dXAgKG51bVN0YXJ0dXBzID09PSAxKTogc2hvdyBmaXJzdCBhbm5vdW5jZW1lbnRcbiAgLy8gLSBBbGwgb3RoZXIgc3RhcnR1cHM6IHJhbmRvbWx5IHNlbGVjdCBmcm9tIGFubm91bmNlbWVudHNcbiAgY29uc3QgW2Fubm91bmNlbWVudF0gPSB1c2VTdGF0ZSgoKSA9PiB7XG4gICAgY29uc3QgYW5ub3VuY2VtZW50cyA9IGdldEluaXRpYWxTZXR0aW5ncygpLmNvbXBhbnlBbm5vdW5jZW1lbnRzXG4gICAgaWYgKCFhbm5vdW5jZW1lbnRzIHx8IGFubm91bmNlbWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgcmV0dXJuIGNvbmZpZy5udW1TdGFydHVwcyA9PT0gMVxuICAgICAgPyBhbm5vdW5jZW1lbnRzWzBdXG4gICAgICA6IGFubm91bmNlbWVudHNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYW5ub3VuY2VtZW50cy5sZW5ndGgpXVxuICB9KVxuICBjb25zdCB7IGhhc1JlbGVhc2VOb3RlcyB9ID0gY2hlY2tGb3JSZWxlYXNlTm90ZXNTeW5jKFxuICAgIGNvbmZpZy5sYXN0UmVsZWFzZU5vdGVzU2VlbixcbiAgKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgY3VycmVudENvbmZpZyA9IGdldEdsb2JhbENvbmZpZygpXG4gICAgaWYgKGN1cnJlbnRDb25maWcubGFzdFJlbGVhc2VOb3Rlc1NlZW4gPT09IE1BQ1JPLlZFUlNJT04pIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBzYXZlR2xvYmFsQ29uZmlnKGN1cnJlbnQgPT4ge1xuICAgICAgaWYgKGN1cnJlbnQubGFzdFJlbGVhc2VOb3Rlc1NlZW4gPT09IE1BQ1JPLlZFUlNJT04pIHJldHVybiBjdXJyZW50XG4gICAgICByZXR1cm4geyAuLi5jdXJyZW50LCBsYXN0UmVsZWFzZU5vdGVzU2VlbjogTUFDUk8uVkVSU0lPTiB9XG4gICAgfSlcbiAgICBpZiAoc2hvd09uYm9hcmRpbmcpIHtcbiAgICAgIGluY3JlbWVudFByb2plY3RPbmJvYXJkaW5nU2VlbkNvdW50KClcbiAgICB9XG4gIH0sIFtjb25maWcsIHNob3dPbmJvYXJkaW5nXSlcblxuICAvLyBJbiBjb25kZW5zZWQgbW9kZSAoZWFybHktcmV0dXJuIGJlbG93IHJlbmRlcnMgPENvbmRlbnNlZExvZ28vPiksXG4gIC8vIENvbmRlbnNlZExvZ28ncyBvd24gdXNlRWZmZWN0IGhhbmRsZXMgdGhlIGltcHJlc3Npb24gY291bnQuIFNraXBwaW5nXG4gIC8vIGhlcmUgYXZvaWRzIGRvdWJsZS1jb3VudGluZyBzaW5jZSBob29rcyBmaXJlIGJlZm9yZSB0aGUgZWFybHkgcmV0dXJuLlxuICBjb25zdCBpc0NvbmRlbnNlZE1vZGUgPVxuICAgICFoYXNSZWxlYXNlTm90ZXMgJiZcbiAgICAhc2hvd09uYm9hcmRpbmcgJiZcbiAgICAhaXNFbnZUcnV0aHkocHJvY2Vzcy5lbnYuQ0xBVURFX0NPREVfRk9SQ0VfRlVMTF9MT0dPKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHNob3dHdWVzdFBhc3Nlc1Vwc2VsbCAmJiAhc2hvd09uYm9hcmRpbmcgJiYgIWlzQ29uZGVuc2VkTW9kZSkge1xuICAgICAgaW5jcmVtZW50R3Vlc3RQYXNzZXNTZWVuQ291bnQoKVxuICAgIH1cbiAgfSwgW3Nob3dHdWVzdFBhc3Nlc1Vwc2VsbCwgc2hvd09uYm9hcmRpbmcsIGlzQ29uZGVuc2VkTW9kZV0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoXG4gICAgICBzaG93T3ZlcmFnZUNyZWRpdFVwc2VsbCAmJlxuICAgICAgIXNob3dPbmJvYXJkaW5nICYmXG4gICAgICAhc2hvd0d1ZXN0UGFzc2VzVXBzZWxsICYmXG4gICAgICAhaXNDb25kZW5zZWRNb2RlXG4gICAgKSB7XG4gICAgICBpbmNyZW1lbnRPdmVyYWdlQ3JlZGl0VXBzZWxsU2VlbkNvdW50KClcbiAgICB9XG4gIH0sIFtcbiAgICBzaG93T3ZlcmFnZUNyZWRpdFVwc2VsbCxcbiAgICBzaG93T25ib2FyZGluZyxcbiAgICBzaG93R3Vlc3RQYXNzZXNVcHNlbGwsXG4gICAgaXNDb25kZW5zZWRNb2RlLFxuICBdKVxuXG4gIGNvbnN0IG1vZGVsID0gdXNlTWFpbkxvb3BNb2RlbCgpXG4gIGNvbnN0IGZ1bGxNb2RlbERpc3BsYXlOYW1lID0gcmVuZGVyTW9kZWxTZXR0aW5nKG1vZGVsKVxuICBjb25zdCB7XG4gICAgdmVyc2lvbixcbiAgICBjd2QsXG4gICAgYmlsbGluZ1R5cGUsXG4gICAgYWdlbnROYW1lOiBhZ2VudE5hbWVGcm9tU2V0dGluZ3MsXG4gIH0gPSBnZXRMb2dvRGlzcGxheURhdGEoKVxuICAvLyBQcmVmZXIgQXBwU3RhdGUuYWdlbnQgKHNldCBmcm9tIC0tYWdlbnQgQ0xJIGZsYWcpIG92ZXIgc2V0dGluZ3NcbiAgY29uc3QgYWdlbnROYW1lID0gYWdlbnQgPz8gYWdlbnROYW1lRnJvbVNldHRpbmdzXG4gIC8vIC0yMCB0byBhY2NvdW50IGZvciB0aGUgbWF4IGxlbmd0aCBvZiBzdWJzY3JpcHRpb24gbmFtZSBcIiDCtyBDbGF1ZGUgRW50ZXJwcmlzZVwiLlxuICBjb25zdCBlZmZvcnRTdWZmaXggPSBnZXRFZmZvcnRTdWZmaXgobW9kZWwsIGVmZm9ydFZhbHVlKVxuICBjb25zdCBtb2RlbERpc3BsYXlOYW1lID0gdHJ1bmNhdGUoXG4gICAgZnVsbE1vZGVsRGlzcGxheU5hbWUgKyBlZmZvcnRTdWZmaXgsXG4gICAgTEVGVF9QQU5FTF9NQVhfV0lEVEggLSAyMCxcbiAgKVxuXG4gIC8vIFNob3cgY29uZGVuc2VkIGxvZ28gaWYgbm8gbmV3IGNoYW5nZWxvZyBhbmQgbm90IHNob3dpbmcgb25ib2FyZGluZyBhbmQgbm90IGZvcmNpbmcgZnVsbCBsb2dvXG4gIGlmIChcbiAgICAhaGFzUmVsZWFzZU5vdGVzICYmXG4gICAgIXNob3dPbmJvYXJkaW5nICYmXG4gICAgIWlzRW52VHJ1dGh5KHByb2Nlc3MuZW52LkNMQVVERV9DT0RFX0ZPUkNFX0ZVTExfTE9HTylcbiAgKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDw+XG4gICAgICAgIDxDb25kZW5zZWRMb2dvIC8+XG4gICAgICAgIDxWb2ljZU1vZGVOb3RpY2UgLz5cbiAgICAgICAgPE9wdXMxbU1lcmdlTm90aWNlIC8+XG4gICAgICAgIHtDaGFubmVsc05vdGljZU1vZHVsZSAmJiA8Q2hhbm5lbHNOb3RpY2VNb2R1bGUuQ2hhbm5lbHNOb3RpY2UgLz59XG4gICAgICAgIHtpc0RlYnVnTW9kZSgpICYmIChcbiAgICAgICAgICA8Qm94IHBhZGRpbmdMZWZ0PXsyfSBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCI+XG4gICAgICAgICAgICA8VGV4dCBjb2xvcj1cIndhcm5pbmdcIj5EZWJ1ZyBtb2RlIGVuYWJsZWQ8L1RleHQ+XG4gICAgICAgICAgICA8VGV4dCBkaW1Db2xvcj5cbiAgICAgICAgICAgICAgTG9nZ2luZyB0bzoge2lzRGVidWdUb1N0ZEVycigpID8gJ3N0ZGVycicgOiBnZXREZWJ1Z0xvZ1BhdGgoKX1cbiAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICA8L0JveD5cbiAgICAgICAgKX1cbiAgICAgICAgPEVtZXJnZW5jeVRpcCAvPlxuICAgICAgICB7cHJvY2Vzcy5lbnYuQ0xBVURFX0NPREVfVE1VWF9TRVNTSU9OICYmIChcbiAgICAgICAgICA8Qm94IHBhZGRpbmdMZWZ0PXsyfSBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCI+XG4gICAgICAgICAgICA8VGV4dCBkaW1Db2xvcj5cbiAgICAgICAgICAgICAgdG11eCBzZXNzaW9uOiB7cHJvY2Vzcy5lbnYuQ0xBVURFX0NPREVfVE1VWF9TRVNTSU9OfVxuICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgPFRleHQgZGltQ29sb3I+XG4gICAgICAgICAgICAgIHtwcm9jZXNzLmVudi5DTEFVREVfQ09ERV9UTVVYX1BSRUZJWF9DT05GTElDVFNcbiAgICAgICAgICAgICAgICA/IGBEZXRhY2g6ICR7cHJvY2Vzcy5lbnYuQ0xBVURFX0NPREVfVE1VWF9QUkVGSVh9ICR7cHJvY2Vzcy5lbnYuQ0xBVURFX0NPREVfVE1VWF9QUkVGSVh9IGQgKHByZXNzIHByZWZpeCB0d2ljZSAtIENsYXVkZSB1c2VzICR7cHJvY2Vzcy5lbnYuQ0xBVURFX0NPREVfVE1VWF9QUkVGSVh9KWBcbiAgICAgICAgICAgICAgICA6IGBEZXRhY2g6ICR7cHJvY2Vzcy5lbnYuQ0xBVURFX0NPREVfVE1VWF9QUkVGSVh9IGRgfVxuICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgIDwvQm94PlxuICAgICAgICApfVxuICAgICAgICB7YW5ub3VuY2VtZW50ICYmIChcbiAgICAgICAgICA8Qm94IHBhZGRpbmdMZWZ0PXsyfSBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCI+XG4gICAgICAgICAgICB7IXByb2Nlc3MuZW52LklTX0RFTU8gJiYgY29uZmlnLm9hdXRoQWNjb3VudD8ub3JnYW5pemF0aW9uTmFtZSAmJiAoXG4gICAgICAgICAgICAgIDxUZXh0IGRpbUNvbG9yPlxuICAgICAgICAgICAgICAgIE1lc3NhZ2UgZnJvbSB7Y29uZmlnLm9hdXRoQWNjb3VudC5vcmdhbml6YXRpb25OYW1lfTpcbiAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDxUZXh0Pnthbm5vdW5jZW1lbnR9PC9UZXh0PlxuICAgICAgICAgIDwvQm94PlxuICAgICAgICApfVxuICAgICAgICB7XCJleHRlcm5hbFwiID09PSAnYW50JyAmJiAhcHJvY2Vzcy5lbnYuREVNT19WRVJTSU9OICYmIChcbiAgICAgICAgICA8Qm94IHBhZGRpbmdMZWZ0PXsyfSBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCI+XG4gICAgICAgICAgICA8VGV4dCBkaW1Db2xvcj5Vc2UgL2lzc3VlIHRvIHJlcG9ydCBtb2RlbCBiZWhhdmlvciBpc3N1ZXM8L1RleHQ+XG4gICAgICAgICAgPC9Cb3g+XG4gICAgICAgICl9XG4gICAgICAgIHtcImV4dGVybmFsXCIgPT09ICdhbnQnICYmICFwcm9jZXNzLmVudi5ERU1PX1ZFUlNJT04gJiYgKFxuICAgICAgICAgIDxCb3ggcGFkZGluZ0xlZnQ9ezJ9IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIj5cbiAgICAgICAgICAgIDxUZXh0IGNvbG9yPVwid2FybmluZ1wiPltBTlQtT05MWV0gTG9nczo8L1RleHQ+XG4gICAgICAgICAgICA8VGV4dCBkaW1Db2xvcj5cbiAgICAgICAgICAgICAgQVBJIGNhbGxzOiB7Z2V0RGlzcGxheVBhdGgoZ2V0RHVtcFByb21wdHNQYXRoKCkpfVxuICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgPFRleHQgZGltQ29sb3I+XG4gICAgICAgICAgICAgIERlYnVnIGxvZ3M6IHtnZXREaXNwbGF5UGF0aChnZXREZWJ1Z0xvZ1BhdGgoKSl9XG4gICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICB7aXNEZXRhaWxlZFByb2ZpbGluZ0VuYWJsZWQoKSAmJiAoXG4gICAgICAgICAgICAgIDxUZXh0IGRpbUNvbG9yPlxuICAgICAgICAgICAgICAgIFN0YXJ0dXAgUGVyZjoge2dldERpc3BsYXlQYXRoKGdldFN0YXJ0dXBQZXJmTG9nUGF0aCgpKX1cbiAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L0JveD5cbiAgICAgICAgKX1cbiAgICAgICAge1wiZXh0ZXJuYWxcIiA9PT0gJ2FudCcgJiYgPEdhdGVPdmVycmlkZXNXYXJuaW5nIC8+fVxuICAgICAgICB7XCJleHRlcm5hbFwiID09PSAnYW50JyAmJiA8RXhwZXJpbWVudEVucm9sbG1lbnROb3RpY2UgLz59XG4gICAgICA8Lz5cbiAgICApXG4gIH1cblxuICAvLyBDYWxjdWxhdGUgbGF5b3V0IGFuZCBkaXNwbGF5IHZhbHVlc1xuICBjb25zdCBsYXlvdXRNb2RlID0gZ2V0TGF5b3V0TW9kZShjb2x1bW5zKVxuXG4gIGNvbnN0IHVzZXJUaGVtZSA9IHJlc29sdmVUaGVtZVNldHRpbmcoZ2V0R2xvYmFsQ29uZmlnKCkudGhlbWUpXG4gIGNvbnN0IGJvcmRlclRpdGxlID0gYCAke2NvbG9yKCdjbGF1ZGUnLCB1c2VyVGhlbWUpKCdDbGF1ZGUgQ29kZScpfSAke2NvbG9yKCdpbmFjdGl2ZScsIHVzZXJUaGVtZSkoYHYke3ZlcnNpb259YCl9IGBcbiAgY29uc3QgY29tcGFjdEJvcmRlclRpdGxlID0gY29sb3IoJ2NsYXVkZScsIHVzZXJUaGVtZSkoJyBDbGF1ZGUgQ29kZSAnKVxuXG4gIC8vIEVhcmx5IHJldHVybiBmb3IgY29tcGFjdCBtb2RlXG4gIGlmIChsYXlvdXRNb2RlID09PSAnY29tcGFjdCcpIHtcbiAgICBjb25zdCBsYXlvdXRXaWR0aCA9IDQgLy8gYm9yZGVyICsgcGFkZGluZ1xuICAgIGxldCB3ZWxjb21lTWVzc2FnZSA9IGZvcm1hdFdlbGNvbWVNZXNzYWdlKHVzZXJuYW1lKVxuICAgIGlmIChzdHJpbmdXaWR0aCh3ZWxjb21lTWVzc2FnZSkgPiBjb2x1bW5zIC0gbGF5b3V0V2lkdGgpIHtcbiAgICAgIHdlbGNvbWVNZXNzYWdlID0gZm9ybWF0V2VsY29tZU1lc3NhZ2UobnVsbClcbiAgICB9XG5cbiAgICAvLyBDYWxjdWxhdGUgY3dkIHdpZHRoIGFjY291bnRpbmcgZm9yIGFnZW50IG5hbWUgaWYgcHJlc2VudFxuICAgIGNvbnN0IHNlcGFyYXRvciA9ICcgwrcgJ1xuICAgIGNvbnN0IGF0UHJlZml4ID0gJ0AnXG4gICAgY29uc3QgY3dkQXZhaWxhYmxlV2lkdGggPSBhZ2VudE5hbWVcbiAgICAgID8gY29sdW1ucyAtXG4gICAgICAgIGxheW91dFdpZHRoIC1cbiAgICAgICAgYXRQcmVmaXgubGVuZ3RoIC1cbiAgICAgICAgc3RyaW5nV2lkdGgoYWdlbnROYW1lKSAtXG4gICAgICAgIHNlcGFyYXRvci5sZW5ndGhcbiAgICAgIDogY29sdW1ucyAtIGxheW91dFdpZHRoXG4gICAgY29uc3QgdHJ1bmNhdGVkQ3dkID0gdHJ1bmNhdGVQYXRoKGN3ZCwgTWF0aC5tYXgoY3dkQXZhaWxhYmxlV2lkdGgsIDEwKSlcbiAgICAvLyBPZmZzY3JlZW5GcmVlemU6IGxvZ28gaXMgdGhlIGZpcnN0IHRoaW5nIHRvIGVudGVyIHNjcm9sbGJhY2s7IHVzZU1haW5Mb29wTW9kZWwoKVxuICAgIC8vIHN1YnNjcmliZXMgdG8gbW9kZWwgY2hhbmdlcyBhbmQgZ2V0TG9nb0Rpc3BsYXlEYXRhKCkgcmVhZHMgY3dkL3N1YnNjcmlwdGlvbiDigJRcbiAgICAvLyBhbnkgY2hhbmdlIHdoaWxlIGluIHNjcm9sbGJhY2sgZm9yY2VzIGEgZnVsbCByZXNldC5cbiAgICByZXR1cm4gKFxuICAgICAgPD5cbiAgICAgICAgPE9mZnNjcmVlbkZyZWV6ZT5cbiAgICAgICAgICA8Qm94XG4gICAgICAgICAgICBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCJcbiAgICAgICAgICAgIGJvcmRlclN0eWxlPVwicm91bmRcIlxuICAgICAgICAgICAgYm9yZGVyQ29sb3I9XCJjbGF1ZGVcIlxuICAgICAgICAgICAgYm9yZGVyVGV4dD17e1xuICAgICAgICAgICAgICBjb250ZW50OiBjb21wYWN0Qm9yZGVyVGl0bGUsXG4gICAgICAgICAgICAgIHBvc2l0aW9uOiAndG9wJyxcbiAgICAgICAgICAgICAgYWxpZ246ICdzdGFydCcsXG4gICAgICAgICAgICAgIG9mZnNldDogMSxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICBwYWRkaW5nWD17MX1cbiAgICAgICAgICAgIHBhZGRpbmdZPXsxfVxuICAgICAgICAgICAgYWxpZ25JdGVtcz1cImNlbnRlclwiXG4gICAgICAgICAgICB3aWR0aD17Y29sdW1uc31cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8VGV4dCBib2xkPnt3ZWxjb21lTWVzc2FnZX08L1RleHQ+XG4gICAgICAgICAgICA8Qm94IG1hcmdpblk9ezF9PlxuICAgICAgICAgICAgICA8Q2xhd2QgLz5cbiAgICAgICAgICAgIDwvQm94PlxuICAgICAgICAgICAgPFRleHQgZGltQ29sb3I+e21vZGVsRGlzcGxheU5hbWV9PC9UZXh0PlxuICAgICAgICAgICAgPFRleHQgZGltQ29sb3I+e2JpbGxpbmdUeXBlfTwvVGV4dD5cbiAgICAgICAgICAgIDxUZXh0IGRpbUNvbG9yPlxuICAgICAgICAgICAgICB7YWdlbnROYW1lID8gYEAke2FnZW50TmFtZX0gwrcgJHt0cnVuY2F0ZWRDd2R9YCA6IHRydW5jYXRlZEN3ZH1cbiAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICA8L0JveD5cbiAgICAgICAgPC9PZmZzY3JlZW5GcmVlemU+XG4gICAgICAgIDxWb2ljZU1vZGVOb3RpY2UgLz5cbiAgICAgICAgPE9wdXMxbU1lcmdlTm90aWNlIC8+XG4gICAgICAgIHtDaGFubmVsc05vdGljZU1vZHVsZSAmJiA8Q2hhbm5lbHNOb3RpY2VNb2R1bGUuQ2hhbm5lbHNOb3RpY2UgLz59XG4gICAgICAgIHtzaG93U2FuZGJveFN0YXR1cyAmJiAoXG4gICAgICAgICAgPEJveCBtYXJnaW5Ub3A9ezF9IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIj5cbiAgICAgICAgICAgIDxUZXh0IGNvbG9yPVwid2FybmluZ1wiPlxuICAgICAgICAgICAgICBZb3VyIGJhc2ggY29tbWFuZHMgd2lsbCBiZSBzYW5kYm94ZWQuIERpc2FibGUgd2l0aCAvc2FuZGJveC5cbiAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICA8L0JveD5cbiAgICAgICAgKX1cbiAgICAgICAge1wiZXh0ZXJuYWxcIiA9PT0gJ2FudCcgJiYgPEdhdGVPdmVycmlkZXNXYXJuaW5nIC8+fVxuICAgICAgICB7XCJleHRlcm5hbFwiID09PSAnYW50JyAmJiA8RXhwZXJpbWVudEVucm9sbG1lbnROb3RpY2UgLz59XG4gICAgICA8Lz5cbiAgICApXG4gIH1cblxuICBjb25zdCB3ZWxjb21lTWVzc2FnZSA9IGZvcm1hdFdlbGNvbWVNZXNzYWdlKHVzZXJuYW1lKVxuICBjb25zdCBtb2RlbExpbmUgPVxuICAgICFwcm9jZXNzLmVudi5JU19ERU1PICYmIGNvbmZpZy5vYXV0aEFjY291bnQ/Lm9yZ2FuaXphdGlvbk5hbWVcbiAgICAgID8gYCR7bW9kZWxEaXNwbGF5TmFtZX0gwrcgJHtiaWxsaW5nVHlwZX0gwrcgJHtjb25maWcub2F1dGhBY2NvdW50Lm9yZ2FuaXphdGlvbk5hbWV9YFxuICAgICAgOiBgJHttb2RlbERpc3BsYXlOYW1lfSDCtyAke2JpbGxpbmdUeXBlfWBcbiAgLy8gQ2FsY3VsYXRlIGN3ZCB3aWR0aCBhY2NvdW50aW5nIGZvciBhZ2VudCBuYW1lIGlmIHByZXNlbnRcbiAgY29uc3QgY3dkU2VwYXJhdG9yID0gJyDCtyAnXG4gIGNvbnN0IGN3ZEF0UHJlZml4ID0gJ0AnXG4gIGNvbnN0IGN3ZEF2YWlsYWJsZVdpZHRoID0gYWdlbnROYW1lXG4gICAgPyBMRUZUX1BBTkVMX01BWF9XSURUSCAtXG4gICAgICBjd2RBdFByZWZpeC5sZW5ndGggLVxuICAgICAgc3RyaW5nV2lkdGgoYWdlbnROYW1lKSAtXG4gICAgICBjd2RTZXBhcmF0b3IubGVuZ3RoXG4gICAgOiBMRUZUX1BBTkVMX01BWF9XSURUSFxuICBjb25zdCB0cnVuY2F0ZWRDd2QgPSB0cnVuY2F0ZVBhdGgoY3dkLCBNYXRoLm1heChjd2RBdmFpbGFibGVXaWR0aCwgMTApKVxuICBjb25zdCBjd2RMaW5lID0gYWdlbnROYW1lID8gYEAke2FnZW50TmFtZX0gwrcgJHt0cnVuY2F0ZWRDd2R9YCA6IHRydW5jYXRlZEN3ZFxuICBjb25zdCBvcHRpbWFsTGVmdFdpZHRoID0gY2FsY3VsYXRlT3B0aW1hbExlZnRXaWR0aChcbiAgICB3ZWxjb21lTWVzc2FnZSxcbiAgICBjd2RMaW5lLFxuICAgIG1vZGVsTGluZSxcbiAgKVxuXG4gIC8vIENhbGN1bGF0ZSBsYXlvdXQgZGltZW5zaW9uc1xuICBjb25zdCB7IGxlZnRXaWR0aCwgcmlnaHRXaWR0aCB9ID0gY2FsY3VsYXRlTGF5b3V0RGltZW5zaW9ucyhcbiAgICBjb2x1bW5zLFxuICAgIGxheW91dE1vZGUsXG4gICAgb3B0aW1hbExlZnRXaWR0aCxcbiAgKVxuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxPZmZzY3JlZW5GcmVlemU+XG4gICAgICAgIDxCb3hcbiAgICAgICAgICBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCJcbiAgICAgICAgICBib3JkZXJTdHlsZT1cInJvdW5kXCJcbiAgICAgICAgICBib3JkZXJDb2xvcj1cImNsYXVkZVwiXG4gICAgICAgICAgYm9yZGVyVGV4dD17e1xuICAgICAgICAgICAgY29udGVudDogYm9yZGVyVGl0bGUsXG4gICAgICAgICAgICBwb3NpdGlvbjogJ3RvcCcsXG4gICAgICAgICAgICBhbGlnbjogJ3N0YXJ0JyxcbiAgICAgICAgICAgIG9mZnNldDogMyxcbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAgey8qIE1haW4gY29udGVudCAqL31cbiAgICAgICAgICA8Qm94XG4gICAgICAgICAgICBmbGV4RGlyZWN0aW9uPXtsYXlvdXRNb2RlID09PSAnaG9yaXpvbnRhbCcgPyAncm93JyA6ICdjb2x1bW4nfVxuICAgICAgICAgICAgcGFkZGluZ1g9ezF9XG4gICAgICAgICAgICBnYXA9ezF9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgey8qIExlZnQgUGFuZWwgKi99XG4gICAgICAgICAgICA8Qm94XG4gICAgICAgICAgICAgIGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIlxuICAgICAgICAgICAgICB3aWR0aD17bGVmdFdpZHRofVxuICAgICAgICAgICAgICBqdXN0aWZ5Q29udGVudD1cInNwYWNlLWJldHdlZW5cIlxuICAgICAgICAgICAgICBhbGlnbkl0ZW1zPVwiY2VudGVyXCJcbiAgICAgICAgICAgICAgbWluSGVpZ2h0PXs5fVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8Qm94IG1hcmdpblRvcD17MX0+XG4gICAgICAgICAgICAgICAgPFRleHQgYm9sZD57d2VsY29tZU1lc3NhZ2V9PC9UZXh0PlxuICAgICAgICAgICAgICA8L0JveD5cblxuICAgICAgICAgICAgICA8Q2xhd2QgLz5cblxuICAgICAgICAgICAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIiBhbGlnbkl0ZW1zPVwiY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPFRleHQgZGltQ29sb3I+e21vZGVsTGluZX08L1RleHQ+XG4gICAgICAgICAgICAgICAgPFRleHQgZGltQ29sb3I+e2N3ZExpbmV9PC9UZXh0PlxuICAgICAgICAgICAgICA8L0JveD5cbiAgICAgICAgICAgIDwvQm94PlxuXG4gICAgICAgICAgICB7LyogVmVydGljYWwgZGl2aWRlciAqL31cbiAgICAgICAgICAgIHtsYXlvdXRNb2RlID09PSAnaG9yaXpvbnRhbCcgJiYgKFxuICAgICAgICAgICAgICA8Qm94XG4gICAgICAgICAgICAgICAgaGVpZ2h0PVwiMTAwJVwiXG4gICAgICAgICAgICAgICAgYm9yZGVyU3R5bGU9XCJzaW5nbGVcIlxuICAgICAgICAgICAgICAgIGJvcmRlckNvbG9yPVwiY2xhdWRlXCJcbiAgICAgICAgICAgICAgICBib3JkZXJEaW1Db2xvclxuICAgICAgICAgICAgICAgIGJvcmRlclRvcD17ZmFsc2V9XG4gICAgICAgICAgICAgICAgYm9yZGVyQm90dG9tPXtmYWxzZX1cbiAgICAgICAgICAgICAgICBib3JkZXJMZWZ0PXtmYWxzZX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgIHsvKiBSaWdodCBQYW5lbCAtIFByb2plY3QgT25ib2FyZGluZyBvciBSZWNlbnQgQWN0aXZpdHkgYW5kIFdoYXQncyBOZXcgKi99XG4gICAgICAgICAgICB7bGF5b3V0TW9kZSA9PT0gJ2hvcml6b250YWwnICYmIChcbiAgICAgICAgICAgICAgPEZlZWRDb2x1bW5cbiAgICAgICAgICAgICAgICBmZWVkcz17XG4gICAgICAgICAgICAgICAgICBzaG93T25ib2FyZGluZ1xuICAgICAgICAgICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVByb2plY3RPbmJvYXJkaW5nRmVlZChnZXRTdGVwcygpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVJlY2VudEFjdGl2aXR5RmVlZChhY3Rpdml0aWVzKSxcbiAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgIDogc2hvd0d1ZXN0UGFzc2VzVXBzZWxsXG4gICAgICAgICAgICAgICAgICAgICAgPyBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVJlY2VudEFjdGl2aXR5RmVlZChhY3Rpdml0aWVzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlR3Vlc3RQYXNzZXNGZWVkKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgOiBzaG93T3ZlcmFnZUNyZWRpdFVwc2VsbFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlUmVjZW50QWN0aXZpdHlGZWVkKGFjdGl2aXRpZXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZU92ZXJhZ2VDcmVkaXRGZWVkKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgIDogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVJlY2VudEFjdGl2aXR5RmVlZChhY3Rpdml0aWVzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVXaGF0c05ld0ZlZWQoY2hhbmdlbG9nKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtYXhXaWR0aD17cmlnaHRXaWR0aH1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9Cb3g+XG4gICAgICAgIDwvQm94PlxuICAgICAgPC9PZmZzY3JlZW5GcmVlemU+XG4gICAgICA8Vm9pY2VNb2RlTm90aWNlIC8+XG4gICAgICA8T3B1czFtTWVyZ2VOb3RpY2UgLz5cbiAgICAgIHtDaGFubmVsc05vdGljZU1vZHVsZSAmJiA8Q2hhbm5lbHNOb3RpY2VNb2R1bGUuQ2hhbm5lbHNOb3RpY2UgLz59XG4gICAgICB7aXNEZWJ1Z01vZGUoKSAmJiAoXG4gICAgICAgIDxCb3ggcGFkZGluZ0xlZnQ9ezJ9IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIj5cbiAgICAgICAgICA8VGV4dCBjb2xvcj1cIndhcm5pbmdcIj5EZWJ1ZyBtb2RlIGVuYWJsZWQ8L1RleHQ+XG4gICAgICAgICAgPFRleHQgZGltQ29sb3I+XG4gICAgICAgICAgICBMb2dnaW5nIHRvOiB7aXNEZWJ1Z1RvU3RkRXJyKCkgPyAnc3RkZXJyJyA6IGdldERlYnVnTG9nUGF0aCgpfVxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgPC9Cb3g+XG4gICAgICApfVxuICAgICAgPEVtZXJnZW5jeVRpcCAvPlxuICAgICAge3Byb2Nlc3MuZW52LkNMQVVERV9DT0RFX1RNVVhfU0VTU0lPTiAmJiAoXG4gICAgICAgIDxCb3ggcGFkZGluZ0xlZnQ9ezJ9IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIj5cbiAgICAgICAgICA8VGV4dCBkaW1Db2xvcj5cbiAgICAgICAgICAgIHRtdXggc2Vzc2lvbjoge3Byb2Nlc3MuZW52LkNMQVVERV9DT0RFX1RNVVhfU0VTU0lPTn1cbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgPFRleHQgZGltQ29sb3I+XG4gICAgICAgICAgICB7cHJvY2Vzcy5lbnYuQ0xBVURFX0NPREVfVE1VWF9QUkVGSVhfQ09ORkxJQ1RTXG4gICAgICAgICAgICAgID8gYERldGFjaDogJHtwcm9jZXNzLmVudi5DTEFVREVfQ09ERV9UTVVYX1BSRUZJWH0gJHtwcm9jZXNzLmVudi5DTEFVREVfQ09ERV9UTVVYX1BSRUZJWH0gZCAocHJlc3MgcHJlZml4IHR3aWNlIC0gQ2xhdWRlIHVzZXMgJHtwcm9jZXNzLmVudi5DTEFVREVfQ09ERV9UTVVYX1BSRUZJWH0pYFxuICAgICAgICAgICAgICA6IGBEZXRhY2g6ICR7cHJvY2Vzcy5lbnYuQ0xBVURFX0NPREVfVE1VWF9QUkVGSVh9IGRgfVxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgPC9Cb3g+XG4gICAgICApfVxuICAgICAge2Fubm91bmNlbWVudCAmJiAoXG4gICAgICAgIDxCb3ggcGFkZGluZ0xlZnQ9ezJ9IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIj5cbiAgICAgICAgICB7IXByb2Nlc3MuZW52LklTX0RFTU8gJiYgY29uZmlnLm9hdXRoQWNjb3VudD8ub3JnYW5pemF0aW9uTmFtZSAmJiAoXG4gICAgICAgICAgICA8VGV4dCBkaW1Db2xvcj5cbiAgICAgICAgICAgICAgTWVzc2FnZSBmcm9tIHtjb25maWcub2F1dGhBY2NvdW50Lm9yZ2FuaXphdGlvbk5hbWV9OlxuICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICl9XG4gICAgICAgICAgPFRleHQ+e2Fubm91bmNlbWVudH08L1RleHQ+XG4gICAgICAgIDwvQm94PlxuICAgICAgKX1cbiAgICAgIHtzaG93U2FuZGJveFN0YXR1cyAmJiAoXG4gICAgICAgIDxCb3ggcGFkZGluZ0xlZnQ9ezJ9IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIj5cbiAgICAgICAgICA8VGV4dCBjb2xvcj1cIndhcm5pbmdcIj5cbiAgICAgICAgICAgIFlvdXIgYmFzaCBjb21tYW5kcyB3aWxsIGJlIHNhbmRib3hlZC4gRGlzYWJsZSB3aXRoIC9zYW5kYm94LlxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgPC9Cb3g+XG4gICAgICApfVxuICAgICAge1wiZXh0ZXJuYWxcIiA9PT0gJ2FudCcgJiYgIXByb2Nlc3MuZW52LkRFTU9fVkVSU0lPTiAmJiAoXG4gICAgICAgIDxCb3ggcGFkZGluZ0xlZnQ9ezJ9IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIj5cbiAgICAgICAgICA8VGV4dCBkaW1Db2xvcj5Vc2UgL2lzc3VlIHRvIHJlcG9ydCBtb2RlbCBiZWhhdmlvciBpc3N1ZXM8L1RleHQ+XG4gICAgICAgIDwvQm94PlxuICAgICAgKX1cbiAgICAgIHtcImV4dGVybmFsXCIgPT09ICdhbnQnICYmICFwcm9jZXNzLmVudi5ERU1PX1ZFUlNJT04gJiYgKFxuICAgICAgICA8Qm94IHBhZGRpbmdMZWZ0PXsyfSBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCI+XG4gICAgICAgICAgPFRleHQgY29sb3I9XCJ3YXJuaW5nXCI+W0FOVC1PTkxZXSBMb2dzOjwvVGV4dD5cbiAgICAgICAgICA8VGV4dCBkaW1Db2xvcj5cbiAgICAgICAgICAgIEFQSSBjYWxsczoge2dldERpc3BsYXlQYXRoKGdldER1bXBQcm9tcHRzUGF0aCgpKX1cbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgPFRleHQgZGltQ29sb3I+RGVidWcgbG9nczoge2dldERpc3BsYXlQYXRoKGdldERlYnVnTG9nUGF0aCgpKX08L1RleHQ+XG4gICAgICAgICAge2lzRGV0YWlsZWRQcm9maWxpbmdFbmFibGVkKCkgJiYgKFxuICAgICAgICAgICAgPFRleHQgZGltQ29sb3I+XG4gICAgICAgICAgICAgIFN0YXJ0dXAgUGVyZjoge2dldERpc3BsYXlQYXRoKGdldFN0YXJ0dXBQZXJmTG9nUGF0aCgpKX1cbiAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICApfVxuICAgICAgICA8L0JveD5cbiAgICAgICl9XG4gICAgICB7XCJleHRlcm5hbFwiID09PSAnYW50JyAmJiA8R2F0ZU92ZXJyaWRlc1dhcm5pbmcgLz59XG4gICAgICB7XCJleHRlcm5hbFwiID09PSAnYW50JyAmJiA8RXhwZXJpbWVudEVucm9sbG1lbnROb3RpY2UgLz59XG4gICAgPC8+XG4gIClcbn1cblxuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQSxPQUFPLEtBQUtBLEtBQUssTUFBTSxPQUFPO0FBQzlCLFNBQVNDLEdBQUcsRUFBRUMsSUFBSSxFQUFFQyxLQUFLLFFBQVEsY0FBYztBQUMvQyxTQUFTQyxlQUFlLFFBQVEsZ0NBQWdDO0FBQ2hFLFNBQVNDLFdBQVcsUUFBUSwwQkFBMEI7QUFDdEQsU0FDRUMsYUFBYSxFQUNiQyx5QkFBeUIsRUFDekJDLHlCQUF5QixFQUN6QkMsb0JBQW9CLEVBQ3BCQyxZQUFZLEVBQ1pDLHFCQUFxQixFQUNyQkMseUJBQXlCLEVBQ3pCQyxrQkFBa0IsUUFDYiw0QkFBNEI7QUFDbkMsU0FBU0MsUUFBUSxRQUFRLHVCQUF1QjtBQUNoRCxTQUFTQyxjQUFjLFFBQVEscUJBQXFCO0FBQ3BELFNBQVNDLEtBQUssUUFBUSxZQUFZO0FBQ2xDLFNBQVNDLFVBQVUsUUFBUSxpQkFBaUI7QUFDNUMsU0FDRUMsd0JBQXdCLEVBQ3hCQyxrQkFBa0IsRUFDbEJDLDJCQUEyQixFQUMzQkMscUJBQXFCLFFBQ2hCLGtCQUFrQjtBQUN6QixTQUFTQyxlQUFlLEVBQUVDLGdCQUFnQixRQUFRLHFCQUFxQjtBQUN2RSxTQUFTQyxtQkFBbUIsUUFBUSwwQkFBMEI7QUFDOUQsU0FBU0Msa0JBQWtCLFFBQVEsZ0NBQWdDO0FBQ25FLFNBQ0VDLFdBQVcsRUFDWEMsZUFBZSxFQUNmQyxlQUFlLFFBQ1Ysb0JBQW9CO0FBQzNCLFNBQVNDLFNBQVMsRUFBRUMsUUFBUSxRQUFRLE9BQU87QUFDM0MsU0FDRUMsUUFBUSxFQUNSQywyQkFBMkIsRUFDM0JDLG1DQUFtQyxRQUM5QixpQ0FBaUM7QUFD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
 
 
1
  // biome-ignore-all assist/source/organizeImports: ANT-ONLY import markers must not be reordered
2
+ import * as React from 'react'
3
+ import { Box, Text, color } from '../../ink.js'
4
+ import { useTerminalSize } from '../../hooks/useTerminalSize.js'
5
+ import { stringWidth } from '../../ink/stringWidth.js'
6
+ import {
7
+ getLayoutMode,
8
+ calculateLayoutDimensions,
9
+ calculateOptimalLeftWidth,
10
+ formatWelcomeMessage,
11
+ truncatePath,
12
+ getRecentActivitySync,
13
+ getRecentReleaseNotesSync,
14
+ getLogoDisplayData,
15
+ } from '../../utils/logoV2Utils.js'
16
+ import { truncate } from '../../utils/format.js'
17
+ import { getDisplayPath } from '../../utils/file.js'
18
+ import { Clawd } from './Clawd.js'
19
+ import { FeedColumn } from './FeedColumn.js'
20
+ import {
21
+ createRecentActivityFeed,
22
+ createWhatsNewFeed,
23
+ createProjectOnboardingFeed,
24
+ createGuestPassesFeed,
25
+ } from './feedConfigs.js'
26
+ import { getGlobalConfig, saveGlobalConfig } from 'src/utils/config.js'
27
+ import { resolveThemeSetting } from 'src/utils/systemTheme.js'
28
+ import { getInitialSettings } from 'src/utils/settings/settings.js'
29
+ import {
30
+ isDebugMode,
31
+ isDebugToStdErr,
32
+ getDebugLogPath,
33
+ } from 'src/utils/debug.js'
34
+ import { useEffect, useState } from 'react'
35
+ import {
36
+ getSteps,
37
+ shouldShowProjectOnboarding,
38
+ incrementProjectOnboardingSeenCount,
39
+ } from '../../projectOnboardingState.js'
40
+ import { CondensedLogo } from './CondensedLogo.js'
41
+ import { OffscreenFreeze } from '../OffscreenFreeze.js'
42
+ import { checkForReleaseNotesSync } from '../../utils/releaseNotes.js'
43
+ import { getDumpPromptsPath } from 'src/services/api/dumpPrompts.js'
44
+ import { isEnvTruthy } from 'src/utils/envUtils.js'
45
+ import {
46
+ getStartupPerfLogPath,
47
+ isDetailedProfilingEnabled,
48
+ } from 'src/utils/startupProfiler.js'
49
+ import { EmergencyTip } from './EmergencyTip.js'
50
+ import { VoiceModeNotice } from './VoiceModeNotice.js'
51
+ import { Opus1mMergeNotice } from './Opus1mMergeNotice.js'
52
+ import { feature } from 'bun:bundle'
53
 
54
  // Conditional require so ChannelsNotice.tsx tree-shakes when both flags are
55
  // false. A module-scope helper component inside a feature() ternary does NOT
 
57
  // whole file. VoiceModeNotice uses the unsafe helper pattern but VOICE_MODE
58
  // is external: true so it's moot there.
59
  /* eslint-disable @typescript-eslint/no-require-imports */
60
+ const ChannelsNoticeModule =
61
+ feature('KAIROS') || feature('KAIROS_CHANNELS')
62
+ ? (require('./ChannelsNotice.js') as typeof import('./ChannelsNotice.js'))
63
+ : null
64
  /* eslint-enable @typescript-eslint/no-require-imports */
65
+ import { SandboxManager } from 'src/utils/sandbox/sandbox-adapter.js'
66
+ import {
67
+ useShowGuestPassesUpsell,
68
+ incrementGuestPassesSeenCount,
69
+ } from './GuestPassesUpsell.js'
70
+ import {
71
+ useShowOverageCreditUpsell,
72
+ incrementOverageCreditUpsellSeenCount,
73
+ createOverageCreditFeed,
74
+ } from './OverageCreditUpsell.js'
75
+ import { plural } from '../../utils/stringUtils.js'
76
+ import { useAppState } from '../../state/AppState.js'
77
+ import { getEffortSuffix } from '../../utils/effort.js'
78
+ import { useMainLoopModel } from '../../hooks/useMainLoopModel.js'
79
+ import { renderModelSetting } from '../../utils/model/model.js'
80
+
81
+ const LEFT_PANEL_MAX_WIDTH = 50
82
+
83
+ export function LogoV2(): React.ReactNode {
84
+ const activities = getRecentActivitySync()
85
+ const username = getGlobalConfig().oauthAccount?.displayName ?? ''
86
+
87
+ const { columns } = useTerminalSize()
88
+ const showOnboarding = shouldShowProjectOnboarding()
89
+ const showSandboxStatus = SandboxManager.isSandboxingEnabled()
90
+ const showGuestPassesUpsell = useShowGuestPassesUpsell()
91
+ const showOverageCreditUpsell = useShowOverageCreditUpsell()
92
+ const agent = useAppState(s => s.agent)
93
+ const effortValue = useAppState(s => s.effortValue)
94
+
95
+ const config = getGlobalConfig()
96
+
97
+ let changelog: string[]
 
 
 
 
 
98
  try {
99
+ changelog = getRecentReleaseNotesSync(3)
100
  } catch {
101
+ changelog = []
102
  }
103
+
104
+ // Get company announcements and select one:
105
+ // - First startup (numStartups === 1): show first announcement
106
+ // - All other startups: randomly select from announcements
107
  const [announcement] = useState(() => {
108
+ const announcements = getInitialSettings().companyAnnouncements
109
+ if (!announcements || announcements.length === 0) return undefined
110
+ return config.numStartups === 1
111
+ ? announcements[0]
112
+ : announcements[Math.floor(Math.random() * announcements.length)]
113
+ })
114
+ const { hasReleaseNotes } = checkForReleaseNotesSync(
115
+ config.lastReleaseNotesSeen,
116
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
117
 
 
118
  useEffect(() => {
119
+ const currentConfig = getGlobalConfig()
120
+ if (currentConfig.lastReleaseNotesSeen === MACRO.VERSION) {
121
+ return
122
+ }
123
+ saveGlobalConfig(current => {
124
+ if (current.lastReleaseNotesSeen === MACRO.VERSION) return current
125
+ return { ...current, lastReleaseNotesSeen: MACRO.VERSION }
126
+ })
127
+ if (showOnboarding) {
128
+ incrementProjectOnboardingSeenCount()
129
+ }
130
+ }, [config, showOnboarding])
 
 
 
131
 
132
+ // In condensed mode (early-return below renders <CondensedLogo/>),
133
+ // CondensedLogo's own useEffect handles the impression count. Skipping
134
+ // here avoids double-counting since hooks fire before the early return.
135
+ const isCondensedMode =
136
+ !hasReleaseNotes &&
137
+ !showOnboarding &&
138
+ !isEnvTruthy(process.env.CLAUDE_CODE_FORCE_FULL_LOGO)
 
 
 
 
 
 
 
139
 
140
+ useEffect(() => {
141
+ if (showGuestPassesUpsell && !showOnboarding && !isCondensedMode) {
142
+ incrementGuestPassesSeenCount()
 
 
 
 
 
 
 
 
143
  }
144
+ }, [showGuestPassesUpsell, showOnboarding, isCondensedMode])
145
 
146
+ useEffect(() => {
147
+ if (
148
+ showOverageCreditUpsell &&
149
+ !showOnboarding &&
150
+ !showGuestPassesUpsell &&
151
+ !isCondensedMode
152
+ ) {
153
+ incrementOverageCreditUpsellSeenCount()
154
  }
155
+ }, [
156
+ showOverageCreditUpsell,
157
+ showOnboarding,
158
+ showGuestPassesUpsell,
159
+ isCondensedMode,
160
+ ])
161
+
162
+ const model = useMainLoopModel()
163
+ const fullModelDisplayName = renderModelSetting(model)
164
  const {
165
  version,
166
  cwd,
167
  billingType,
168
+ agentName: agentNameFromSettings,
169
+ } = getLogoDisplayData()
170
+ // Prefer AppState.agent (set from --agent CLI flag) over settings
171
+ const agentName = agent ?? agentNameFromSettings
172
+ // -20 to account for the max length of subscription name " Β· Claude Enterprise".
173
+ const effortSuffix = getEffortSuffix(model, effortValue)
174
+ const modelDisplayName = truncate(
175
+ fullModelDisplayName + effortSuffix,
176
+ LEFT_PANEL_MAX_WIDTH - 20,
177
+ )
178
+
179
+ // Show condensed logo if no new changelog and not showing onboarding and not forcing full logo
180
+ if (
181
+ !hasReleaseNotes &&
182
+ !showOnboarding &&
183
+ !isEnvTruthy(process.env.CLAUDE_CODE_FORCE_FULL_LOGO)
184
+ ) {
185
+ return (
186
+ <>
187
+ <CondensedLogo />
188
+ <VoiceModeNotice />
189
+ <Opus1mMergeNotice />
190
+ {ChannelsNoticeModule && <ChannelsNoticeModule.ChannelsNotice />}
191
+ {isDebugMode() && (
192
+ <Box paddingLeft={2} flexDirection="column">
193
+ <Text color="warning">Debug mode enabled</Text>
194
+ <Text dimColor>
195
+ Logging to: {isDebugToStdErr() ? 'stderr' : getDebugLogPath()}
196
+ </Text>
197
+ </Box>
198
+ )}
199
+ <EmergencyTip />
200
+ {process.env.CLAUDE_CODE_TMUX_SESSION && (
201
+ <Box paddingLeft={2} flexDirection="column">
202
+ <Text dimColor>
203
+ tmux session: {process.env.CLAUDE_CODE_TMUX_SESSION}
204
+ </Text>
205
+ <Text dimColor>
206
+ {process.env.CLAUDE_CODE_TMUX_PREFIX_CONFLICTS
207
+ ? `Detach: ${process.env.CLAUDE_CODE_TMUX_PREFIX} ${process.env.CLAUDE_CODE_TMUX_PREFIX} d (press prefix twice - Claude uses ${process.env.CLAUDE_CODE_TMUX_PREFIX})`
208
+ : `Detach: ${process.env.CLAUDE_CODE_TMUX_PREFIX} d`}
209
+ </Text>
210
+ </Box>
211
+ )}
212
+ {announcement && (
213
+ <Box paddingLeft={2} flexDirection="column">
214
+ {!process.env.IS_DEMO && config.oauthAccount?.organizationName && (
215
+ <Text dimColor>
216
+ Message from {config.oauthAccount.organizationName}:
217
+ </Text>
218
+ )}
219
+ <Text>{announcement}</Text>
220
+ </Box>
221
+ )}
222
+ {"external" === 'ant' && !process.env.DEMO_VERSION && (
223
+ <Box paddingLeft={2} flexDirection="column">
224
+ <Text dimColor>Use /issue to report model behavior issues</Text>
225
+ </Box>
226
+ )}
227
+ {"external" === 'ant' && !process.env.DEMO_VERSION && (
228
+ <Box paddingLeft={2} flexDirection="column">
229
+ <Text color="warning">[ANT-ONLY] Logs:</Text>
230
+ <Text dimColor>
231
+ API calls: {getDisplayPath(getDumpPromptsPath())}
232
+ </Text>
233
+ <Text dimColor>
234
+ Debug logs: {getDisplayPath(getDebugLogPath())}
235
+ </Text>
236
+ {isDetailedProfilingEnabled() && (
237
+ <Text dimColor>
238
+ Startup Perf: {getDisplayPath(getStartupPerfLogPath())}
239
+ </Text>
240
+ )}
241
+ </Box>
242
+ )}
243
+ {"external" === 'ant' && <GateOverridesWarning />}
244
+ {"external" === 'ant' && <ExperimentEnrollmentNotice />}
245
+ </>
246
+ )
 
 
 
 
247
  }
248
+
249
+ // Calculate layout and display values
250
+ const layoutMode = getLayoutMode(columns)
251
+
252
+ const userTheme = resolveThemeSetting(getGlobalConfig().theme)
253
+ const borderTitle = ` ${color('claude', userTheme)('Claude Code')} ${color('inactive', userTheme)(`v${version}`)} `
254
+ const compactBorderTitle = color('claude', userTheme)(' Claude Code ')
255
+
256
+ // Early return for compact mode
257
+ if (layoutMode === 'compact') {
258
+ const layoutWidth = 4 // border + padding
259
+ let welcomeMessage = formatWelcomeMessage(username)
260
+ if (stringWidth(welcomeMessage) > columns - layoutWidth) {
261
+ welcomeMessage = formatWelcomeMessage(null)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
262
  }
263
+
264
+ // Calculate cwd width accounting for agent name if present
265
+ const separator = ' Β· '
266
+ const atPrefix = '@'
267
+ const cwdAvailableWidth = agentName
268
+ ? columns -
269
+ layoutWidth -
270
+ atPrefix.length -
271
+ stringWidth(agentName) -
272
+ separator.length
273
+ : columns - layoutWidth
274
+ const truncatedCwd = truncatePath(cwd, Math.max(cwdAvailableWidth, 10))
275
+ // OffscreenFreeze: logo is the first thing to enter scrollback; useMainLoopModel()
276
+ // subscribes to model changes and getLogoDisplayData() reads cwd/subscription β€”
277
+ // any change while in scrollback forces a full reset.
278
+ return (
279
+ <>
280
+ <OffscreenFreeze>
281
+ <Box
282
+ flexDirection="column"
283
+ borderStyle="round"
284
+ borderColor="claude"
285
+ borderText={{
286
+ content: compactBorderTitle,
287
+ position: 'top',
288
+ align: 'start',
289
+ offset: 1,
290
+ }}
291
+ paddingX={1}
292
+ paddingY={1}
293
+ alignItems="center"
294
+ width={columns}
295
+ >
296
+ <Text bold>{welcomeMessage}</Text>
297
+ <Box marginY={1}>
298
+ <Clawd />
299
+ </Box>
300
+ <Text dimColor>{modelDisplayName}</Text>
301
+ <Text dimColor>{billingType}</Text>
302
+ <Text dimColor>
303
+ {agentName ? `@${agentName} Β· ${truncatedCwd}` : truncatedCwd}
304
+ </Text>
305
+ </Box>
306
+ </OffscreenFreeze>
307
+ <VoiceModeNotice />
308
+ <Opus1mMergeNotice />
309
+ {ChannelsNoticeModule && <ChannelsNoticeModule.ChannelsNotice />}
310
+ {showSandboxStatus && (
311
+ <Box marginTop={1} flexDirection="column">
312
+ <Text color="warning">
313
+ Your bash commands will be sandboxed. Disable with /sandbox.
314
+ </Text>
315
+ </Box>
316
+ )}
317
+ {"external" === 'ant' && <GateOverridesWarning />}
318
+ {"external" === 'ant' && <ExperimentEnrollmentNotice />}
319
+ </>
320
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
321
  }
322
+
323
+ const welcomeMessage = formatWelcomeMessage(username)
324
+ const modelLine =
325
+ !process.env.IS_DEMO && config.oauthAccount?.organizationName
326
+ ? `${modelDisplayName} Β· ${billingType} Β· ${config.oauthAccount.organizationName}`
327
+ : `${modelDisplayName} Β· ${billingType}`
328
+ // Calculate cwd width accounting for agent name if present
329
+ const cwdSeparator = ' Β· '
330
+ const cwdAtPrefix = '@'
331
+ const cwdAvailableWidth = agentName
332
+ ? LEFT_PANEL_MAX_WIDTH -
333
+ cwdAtPrefix.length -
334
+ stringWidth(agentName) -
335
+ cwdSeparator.length
336
+ : LEFT_PANEL_MAX_WIDTH
337
+ const truncatedCwd = truncatePath(cwd, Math.max(cwdAvailableWidth, 10))
338
+ const cwdLine = agentName ? `@${agentName} Β· ${truncatedCwd}` : truncatedCwd
339
+ const optimalLeftWidth = calculateOptimalLeftWidth(
340
+ welcomeMessage,
341
+ cwdLine,
342
+ modelLine,
343
+ )
344
+
345
+ // Calculate layout dimensions
346
+ const { leftWidth, rightWidth } = calculateLayoutDimensions(
347
+ columns,
348
+ layoutMode,
349
+ optimalLeftWidth,
350
+ )
351
+
352
+ return (
353
+ <>
354
+ <OffscreenFreeze>
355
+ <Box
356
+ flexDirection="column"
357
+ borderStyle="round"
358
+ borderColor="claude"
359
+ borderText={{
360
+ content: borderTitle,
361
+ position: 'top',
362
+ align: 'start',
363
+ offset: 3,
364
+ }}
365
+ >
366
+ {/* Main content */}
367
+ <Box
368
+ flexDirection={layoutMode === 'horizontal' ? 'row' : 'column'}
369
+ paddingX={1}
370
+ gap={1}
371
+ >
372
+ {/* Left Panel */}
373
+ <Box
374
+ flexDirection="column"
375
+ width={leftWidth}
376
+ justifyContent="space-between"
377
+ alignItems="center"
378
+ minHeight={9}
379
+ >
380
+ <Box marginTop={1}>
381
+ <Text bold>{welcomeMessage}</Text>
382
+ </Box>
383
+
384
+ <Clawd />
385
+
386
+ <Box flexDirection="column" alignItems="center">
387
+ <Text dimColor>{modelLine}</Text>
388
+ <Text dimColor>{cwdLine}</Text>
389
+ </Box>
390
+ </Box>
391
+
392
+ {/* Vertical divider */}
393
+ {layoutMode === 'horizontal' && (
394
+ <Box
395
+ height="100%"
396
+ borderStyle="single"
397
+ borderColor="claude"
398
+ borderDimColor
399
+ borderTop={false}
400
+ borderBottom={false}
401
+ borderLeft={false}
402
+ />
403
+ )}
404
+
405
+ {/* Right Panel - Project Onboarding or Recent Activity and What's New */}
406
+ {layoutMode === 'horizontal' && (
407
+ <FeedColumn
408
+ feeds={
409
+ showOnboarding
410
+ ? [
411
+ createProjectOnboardingFeed(getSteps()),
412
+ createRecentActivityFeed(activities),
413
+ ]
414
+ : showGuestPassesUpsell
415
+ ? [
416
+ createRecentActivityFeed(activities),
417
+ createGuestPassesFeed(),
418
+ ]
419
+ : showOverageCreditUpsell
420
+ ? [
421
+ createRecentActivityFeed(activities),
422
+ createOverageCreditFeed(),
423
+ ]
424
+ : [
425
+ createRecentActivityFeed(activities),
426
+ createWhatsNewFeed(changelog),
427
+ ]
428
+ }
429
+ maxWidth={rightWidth}
430
+ />
431
+ )}
432
+ </Box>
433
+ </Box>
434
+ </OffscreenFreeze>
435
+ <VoiceModeNotice />
436
+ <Opus1mMergeNotice />
437
+ {ChannelsNoticeModule && <ChannelsNoticeModule.ChannelsNotice />}
438
+ {isDebugMode() && (
439
+ <Box paddingLeft={2} flexDirection="column">
440
+ <Text color="warning">Debug mode enabled</Text>
441
+ <Text dimColor>
442
+ Logging to: {isDebugToStdErr() ? 'stderr' : getDebugLogPath()}
443
+ </Text>
444
+ </Box>
445
+ )}
446
+ <EmergencyTip />
447
+ {process.env.CLAUDE_CODE_TMUX_SESSION && (
448
+ <Box paddingLeft={2} flexDirection="column">
449
+ <Text dimColor>
450
+ tmux session: {process.env.CLAUDE_CODE_TMUX_SESSION}
451
+ </Text>
452
+ <Text dimColor>
453
+ {process.env.CLAUDE_CODE_TMUX_PREFIX_CONFLICTS
454
+ ? `Detach: ${process.env.CLAUDE_CODE_TMUX_PREFIX} ${process.env.CLAUDE_CODE_TMUX_PREFIX} d (press prefix twice - Claude uses ${process.env.CLAUDE_CODE_TMUX_PREFIX})`
455
+ : `Detach: ${process.env.CLAUDE_CODE_TMUX_PREFIX} d`}
456
+ </Text>
457
+ </Box>
458
+ )}
459
+ {announcement && (
460
+ <Box paddingLeft={2} flexDirection="column">
461
+ {!process.env.IS_DEMO && config.oauthAccount?.organizationName && (
462
+ <Text dimColor>
463
+ Message from {config.oauthAccount.organizationName}:
464
+ </Text>
465
+ )}
466
+ <Text>{announcement}</Text>
467
+ </Box>
468
+ )}
469
+ {showSandboxStatus && (
470
+ <Box paddingLeft={2} flexDirection="column">
471
+ <Text color="warning">
472
+ Your bash commands will be sandboxed. Disable with /sandbox.
473
+ </Text>
474
+ </Box>
475
+ )}
476
+ {"external" === 'ant' && !process.env.DEMO_VERSION && (
477
+ <Box paddingLeft={2} flexDirection="column">
478
+ <Text dimColor>Use /issue to report model behavior issues</Text>
479
+ </Box>
480
+ )}
481
+ {"external" === 'ant' && !process.env.DEMO_VERSION && (
482
+ <Box paddingLeft={2} flexDirection="column">
483
+ <Text color="warning">[ANT-ONLY] Logs:</Text>
484
+ <Text dimColor>
485
+ API calls: {getDisplayPath(getDumpPromptsPath())}
486
+ </Text>
487
+ <Text dimColor>Debug logs: {getDisplayPath(getDebugLogPath())}</Text>
488
+ {isDetailedProfilingEnabled() && (
489
+ <Text dimColor>
490
+ Startup Perf: {getDisplayPath(getStartupPerfLogPath())}
491
+ </Text>
492
+ )}
493
+ </Box>
494
+ )}
495
+ {"external" === 'ant' && <GateOverridesWarning />}
496
+ {"external" === 'ant' && <ExperimentEnrollmentNotice />}
497
+ </>
498
+ )
499
  }
500
+
src/components/LogoV2/Opus1mMergeNotice.tsx CHANGED
@@ -1,55 +1,41 @@
1
- import { c as _c } from "react/compiler-runtime";
2
- import * as React from 'react';
3
- import { useEffect, useState } from 'react';
4
- import { UP_ARROW } from '../../constants/figures.js';
5
- import { Box, Text } from '../../ink.js';
6
- import { getGlobalConfig, saveGlobalConfig } from '../../utils/config.js';
7
- import { isOpus1mMergeEnabled } from '../../utils/model/model.js';
8
- import { AnimatedAsterisk } from './AnimatedAsterisk.js';
9
- const MAX_SHOW_COUNT = 6;
 
10
  export function shouldShowOpus1mMergeNotice(): boolean {
11
- return isOpus1mMergeEnabled() && (getGlobalConfig().opus1mMergeNoticeSeenCount ?? 0) < MAX_SHOW_COUNT;
 
 
 
12
  }
13
- export function Opus1mMergeNotice() {
14
- const $ = _c(4);
15
- const [show] = useState(shouldShowOpus1mMergeNotice);
16
- let t0;
17
- let t1;
18
- if ($[0] !== show) {
19
- t0 = () => {
20
- if (!show) {
21
- return;
22
- }
23
- const newCount = (getGlobalConfig().opus1mMergeNoticeSeenCount ?? 0) + 1;
24
- saveGlobalConfig(prev => {
25
- if ((prev.opus1mMergeNoticeSeenCount ?? 0) >= newCount) {
26
- return prev;
27
- }
28
- return {
29
- ...prev,
30
- opus1mMergeNoticeSeenCount: newCount
31
- };
32
- });
33
- };
34
- t1 = [show];
35
- $[0] = show;
36
- $[1] = t0;
37
- $[2] = t1;
38
- } else {
39
- t0 = $[1];
40
- t1 = $[2];
41
- }
42
- useEffect(t0, t1);
43
- if (!show) {
44
- return null;
45
- }
46
- let t2;
47
- if ($[3] === Symbol.for("react.memo_cache_sentinel")) {
48
- t2 = <Box paddingLeft={2}><AnimatedAsterisk char={UP_ARROW} /><Text dimColor={true}>{" "}Opus now defaults to 1M context Β· 5x more room, same pricing</Text></Box>;
49
- $[3] = t2;
50
- } else {
51
- t2 = $[3];
52
- }
53
- return t2;
54
  }
55
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZUVmZmVjdCIsInVzZVN0YXRlIiwiVVBfQVJST1ciLCJCb3giLCJUZXh0IiwiZ2V0R2xvYmFsQ29uZmlnIiwic2F2ZUdsb2JhbENvbmZpZyIsImlzT3B1czFtTWVyZ2VFbmFibGVkIiwiQW5pbWF0ZWRBc3RlcmlzayIsIk1BWF9TSE9XX0NPVU5UIiwic2hvdWxkU2hvd09wdXMxbU1lcmdlTm90aWNlIiwib3B1czFtTWVyZ2VOb3RpY2VTZWVuQ291bnQiLCJPcHVzMW1NZXJnZU5vdGljZSIsIiQiLCJfYyIsInNob3ciLCJ0MCIsInQxIiwibmV3Q291bnQiLCJwcmV2IiwidDIiLCJTeW1ib2wiLCJmb3IiXSwic291cmNlcyI6WyJPcHVzMW1NZXJnZU5vdGljZS50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBVUF9BUlJPVyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9maWd1cmVzLmpzJ1xuaW1wb3J0IHsgQm94LCBUZXh0IH0gZnJvbSAnLi4vLi4vaW5rLmpzJ1xuaW1wb3J0IHsgZ2V0R2xvYmFsQ29uZmlnLCBzYXZlR2xvYmFsQ29uZmlnIH0gZnJvbSAnLi4vLi4vdXRpbHMvY29uZmlnLmpzJ1xuaW1wb3J0IHsgaXNPcHVzMW1NZXJnZUVuYWJsZWQgfSBmcm9tICcuLi8uLi91dGlscy9tb2RlbC9tb2RlbC5qcydcbmltcG9ydCB7IEFuaW1hdGVkQXN0ZXJpc2sgfSBmcm9tICcuL0FuaW1hdGVkQXN0ZXJpc2suanMnXG5cbmNvbnN0IE1BWF9TSE9XX0NPVU5UID0gNlxuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkU2hvd09wdXMxbU1lcmdlTm90aWNlKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGlzT3B1czFtTWVyZ2VFbmFibGVkKCkgJiZcbiAgICAoZ2V0R2xvYmFsQ29uZmlnKCkub3B1czFtTWVyZ2VOb3RpY2VTZWVuQ291bnQgPz8gMCkgPCBNQVhfU0hPV19DT1VOVFxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBPcHVzMW1NZXJnZU5vdGljZSgpOiBSZWFjdC5SZWFjdE5vZGUge1xuICBjb25zdCBbc2hvd10gPSB1c2VTdGF0ZShzaG91bGRTaG93T3B1czFtTWVyZ2VOb3RpY2UpXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIXNob3cpIHJldHVyblxuICAgIGNvbnN0IG5ld0NvdW50ID0gKGdldEdsb2JhbENvbmZpZygpLm9wdXMxbU1lcmdlTm90aWNlU2VlbkNvdW50ID8/IDApICsgMVxuICAgIHNhdmVHbG9iYWxDb25maWcocHJldiA9PiB7XG4gICAgICBpZiAoKHByZXYub3B1czFtTWVyZ2VOb3RpY2VTZWVuQ291bnQgPz8gMCkgPj0gbmV3Q291bnQpIHJldHVybiBwcmV2XG4gICAgICByZXR1cm4geyAuLi5wcmV2LCBvcHVzMW1NZXJnZU5vdGljZVNlZW5Db3VudDogbmV3Q291bnQgfVxuICAgIH0pXG4gIH0sIFtzaG93XSlcblxuICBpZiAoIXNob3cpIHJldHVybiBudWxsXG5cbiAgcmV0dXJuIChcbiAgICA8Qm94IHBhZGRpbmdMZWZ0PXsyfT5cbiAgICAgIDxBbmltYXRlZEFzdGVyaXNrIGNoYXI9e1VQX0FSUk9XfSAvPlxuICAgICAgPFRleHQgZGltQ29sb3I+XG4gICAgICAgIHsnICd9XG4gICAgICAgIE9wdXMgbm93IGRlZmF1bHRzIHRvIDFNIGNvbnRleHQgwrcgNXggbW9yZSByb29tLCBzYW1lIHByaWNpbmdcbiAgICAgIDwvVGV4dD5cbiAgICA8L0JveD5cbiAgKVxufVxuIl0sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxLQUFLQSxLQUFLLE1BQU0sT0FBTztBQUM5QixTQUFTQyxTQUFTLEVBQUVDLFFBQVEsUUFBUSxPQUFPO0FBQzNDLFNBQVNDLFFBQVEsUUFBUSw0QkFBNEI7QUFDckQsU0FBU0MsR0FBRyxFQUFFQyxJQUFJLFFBQVEsY0FBYztBQUN4QyxTQUFTQyxlQUFlLEVBQUVDLGdCQUFnQixRQUFRLHVCQUF1QjtBQUN6RSxTQUFTQyxvQkFBb0IsUUFBUSw0QkFBNEI7QUFDakUsU0FBU0MsZ0JBQWdCLFFBQVEsdUJBQXVCO0FBRXhELE1BQU1DLGNBQWMsR0FBRyxDQUFDO0FBRXhCLE9BQU8sU0FBU0MsMkJBQTJCQSxDQUFBLENBQUUsRUFBRSxPQUFPLENBQUM7RUFDckQsT0FDRUgsb0JBQW9CLENBQUMsQ0FBQyxJQUN0QixDQUFDRixlQUFlLENBQUMsQ0FBQyxDQUFDTSwwQkFBMEIsSUFBSSxDQUFDLElBQUlGLGNBQWM7QUFFeEU7QUFFQSxPQUFPLFNBQUFHLGtCQUFBO0VBQUEsTUFBQUMsQ0FBQSxHQUFBQyxFQUFBO0VBQ0wsT0FBQUMsSUFBQSxJQUFlZCxRQUFRLENBQUNTLDJCQUEyQixDQUFDO0VBQUEsSUFBQU0sRUFBQTtFQUFBLElBQUFDLEVBQUE7RUFBQSxJQUFBSixDQUFBLFFBQUFFLElBQUE7SUFFMUNDLEVBQUEsR0FBQUEsQ0FBQTtNQUNSLElBQUksQ0FBQ0QsSUFBSTtRQUFBO01BQUE7TUFDVCxNQUFBRyxRQUFBLEdBQWlCLENBQUNiLGVBQWUsQ0FBQyxDQUFDLENBQUFNLDBCQUFnQyxJQUFqRCxDQUFpRCxJQUFJLENBQUM7TUFDeEVMLGdCQUFnQixDQUFDYSxJQUFBO1FBQ2YsSUFBSSxDQUFDQSxJQUFJLENBQUFSLDBCQUFnQyxJQUFwQyxDQUFvQyxLQUFLTyxRQUFRO1VBQUEsT0FBU0MsSUFBSTtRQUFBO1FBQUEsT0FDNUQ7VUFBQSxHQUFLQSxJQUFJO1VBQUFSLDBCQUFBLEVBQThCTztRQUFTLENBQUM7TUFBQSxDQUN6RCxDQUFDO0lBQUEsQ0FDSDtJQUFFRCxFQUFBLElBQUNGLElBQUksQ0FBQztJQUFBRixDQUFBLE1BQUFFLElBQUE7SUFBQUYsQ0FBQSxNQUFBRyxFQUFBO0lBQUFILENBQUEsTUFBQUksRUFBQTtFQUFBO0lBQUFELEVBQUEsR0FBQUgsQ0FBQTtJQUFBSSxFQUFBLEdBQUFKLENBQUE7RUFBQTtFQVBUYixTQUFTLENBQUNnQixFQU9ULEVBQUVDLEVBQU0sQ0FBQztFQUVWLElBQUksQ0FBQ0YsSUFBSTtJQUFBLE9BQVMsSUFBSTtFQUFBO0VBQUEsSUFBQUssRUFBQTtFQUFBLElBQUFQLENBQUEsUUFBQVEsTUFBQSxDQUFBQyxHQUFBO0lBR3BCRixFQUFBLElBQUMsR0FBRyxDQUFjLFdBQUMsQ0FBRCxHQUFDLENBQ2pCLENBQUMsZ0JBQWdCLENBQU9sQixJQUFRLENBQVJBLFNBQU8sQ0FBQyxHQUNoQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQVIsS0FBTyxDQUFDLENBQ1gsSUFBRSxDQUFFLDREQUVQLEVBSEMsSUFBSSxDQUlQLEVBTkMsR0FBRyxDQU1FO0lBQUFXLENBQUEsTUFBQU8sRUFBQTtFQUFBO0lBQUFBLEVBQUEsR0FBQVAsQ0FBQTtFQUFBO0VBQUEsT0FOTk8sRUFNTTtBQUFBIiwiaWdub3JlTGlzdCI6W119
 
1
+ import * as React from 'react'
2
+ import { useEffect, useState } from 'react'
3
+ import { UP_ARROW } from '../../constants/figures.js'
4
+ import { Box, Text } from '../../ink.js'
5
+ import { getGlobalConfig, saveGlobalConfig } from '../../utils/config.js'
6
+ import { isOpus1mMergeEnabled } from '../../utils/model/model.js'
7
+ import { AnimatedAsterisk } from './AnimatedAsterisk.js'
8
+
9
+ const MAX_SHOW_COUNT = 6
10
+
11
  export function shouldShowOpus1mMergeNotice(): boolean {
12
+ return (
13
+ isOpus1mMergeEnabled() &&
14
+ (getGlobalConfig().opus1mMergeNoticeSeenCount ?? 0) < MAX_SHOW_COUNT
15
+ )
16
  }
17
+
18
+ export function Opus1mMergeNotice(): React.ReactNode {
19
+ const [show] = useState(shouldShowOpus1mMergeNotice)
20
+
21
+ useEffect(() => {
22
+ if (!show) return
23
+ const newCount = (getGlobalConfig().opus1mMergeNoticeSeenCount ?? 0) + 1
24
+ saveGlobalConfig(prev => {
25
+ if ((prev.opus1mMergeNoticeSeenCount ?? 0) >= newCount) return prev
26
+ return { ...prev, opus1mMergeNoticeSeenCount: newCount }
27
+ })
28
+ }, [show])
29
+
30
+ if (!show) return null
31
+
32
+ return (
33
+ <Box paddingLeft={2}>
34
+ <AnimatedAsterisk char={UP_ARROW} />
35
+ <Text dimColor>
36
+ {' '}
37
+ Opus now defaults to 1M context Β· 5x more room, same pricing
38
+ </Text>
39
+ </Box>
40
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41
  }
 
src/components/LogoV2/OverageCreditUpsell.tsx CHANGED
@@ -1,13 +1,17 @@
1
- import { c as _c } from "react/compiler-runtime";
2
- import * as React from 'react';
3
- import { useState } from 'react';
4
- import { Text } from '../../ink.js';
5
- import { logEvent } from '../../services/analytics/index.js';
6
- import { formatGrantAmount, getCachedOverageCreditGrant, refreshOverageCreditGrantCache } from '../../services/api/overageCreditGrant.js';
7
- import { getGlobalConfig, saveGlobalConfig } from '../../utils/config.js';
8
- import { truncate } from '../../utils/format.js';
9
- import type { FeedConfig } from './Feed.js';
10
- const MAX_IMPRESSIONS = 3;
 
 
 
 
11
 
12
  /**
13
  * Whether to show the overage credit upsell on any surface.
@@ -25,16 +29,20 @@ const MAX_IMPRESSIONS = 3;
25
  * (welcome feed, tips).
26
  */
27
  export function isEligibleForOverageCreditGrant(): boolean {
28
- const info = getCachedOverageCreditGrant();
29
- if (!info || !info.available || info.granted) return false;
30
- return formatGrantAmount(info) !== null;
31
  }
 
32
  export function shouldShowOverageCreditUpsell(): boolean {
33
- if (!isEligibleForOverageCreditGrant()) return false;
34
- const config = getGlobalConfig();
35
- if (config.hasVisitedExtraUsage) return false;
36
- if ((config.overageCreditUpsellSeenCount ?? 0) >= MAX_IMPRESSIONS) return false;
37
- return true;
 
 
 
38
  }
39
 
40
  /**
@@ -42,105 +50,78 @@ export function shouldShowOverageCreditUpsell(): boolean {
42
  * unconditionally on mount β€” it no-ops if cache is fresh.
43
  */
44
  export function maybeRefreshOverageCreditCache(): void {
45
- if (getCachedOverageCreditGrant() !== null) return;
46
- void refreshOverageCreditGrantCache();
47
- }
48
- export function useShowOverageCreditUpsell() {
49
- const [show] = useState(_temp);
50
- return show;
51
  }
52
- function _temp() {
53
- maybeRefreshOverageCreditCache();
54
- return shouldShowOverageCreditUpsell();
 
 
 
 
55
  }
 
56
  export function incrementOverageCreditUpsellSeenCount(): void {
57
- let newCount = 0;
58
  saveGlobalConfig(prev => {
59
- newCount = (prev.overageCreditUpsellSeenCount ?? 0) + 1;
60
  return {
61
  ...prev,
62
- overageCreditUpsellSeenCount: newCount
63
- };
64
- });
65
- logEvent('tengu_overage_credit_upsell_shown', {
66
- seen_count: newCount
67
- });
68
  }
69
 
70
  // Copy from "OC & Bulk Overages copy" doc (#6 β€” CLI /usage)
71
  function getUsageText(amount: string): string {
72
- return `${amount} in extra usage for third-party apps Β· /extra-usage`;
73
  }
74
 
75
  // Copy from "OC & Bulk Overages copy" doc (#4 β€” CLI Welcome screen).
76
  // Char budgets: title ≀19, subtitle ≀48.
77
- const FEED_SUBTITLE = 'On us. Works on third-party apps Β· /extra-usage';
 
78
  function getFeedTitle(amount: string): string {
79
- return `${amount} in extra usage`;
80
  }
81
- type Props = {
82
- maxWidth?: number;
83
- twoLine?: boolean;
84
- };
85
- export function OverageCreditUpsell(t0) {
86
- const $ = _c(8);
87
- const {
88
- maxWidth,
89
- twoLine
90
- } = t0;
91
- let t1;
92
- let t2;
93
- if ($[0] !== maxWidth || $[1] !== twoLine) {
94
- t2 = Symbol.for("react.early_return_sentinel");
95
- bb0: {
96
- const info = getCachedOverageCreditGrant();
97
- if (!info) {
98
- t2 = null;
99
- break bb0;
100
- }
101
- const amount = formatGrantAmount(info);
102
- if (!amount) {
103
- t2 = null;
104
- break bb0;
105
- }
106
- if (twoLine) {
107
- const title = getFeedTitle(amount);
108
- let t3;
109
- if ($[4] !== maxWidth) {
110
- t3 = maxWidth ? truncate(FEED_SUBTITLE, maxWidth) : FEED_SUBTITLE;
111
- $[4] = maxWidth;
112
- $[5] = t3;
113
- } else {
114
- t3 = $[5];
115
- }
116
- let t4;
117
- if ($[6] !== t3) {
118
- t4 = <Text dimColor={true}>{t3}</Text>;
119
- $[6] = t3;
120
- $[7] = t4;
121
- } else {
122
- t4 = $[7];
123
- }
124
- t2 = <><Text color="startupAccent">{maxWidth ? truncate(title, maxWidth) : title}</Text>{t4}</>;
125
- break bb0;
126
- }
127
- const text = getUsageText(amount);
128
- const display = maxWidth ? truncate(text, maxWidth) : text;
129
- const highlightLen = Math.min(getFeedTitle(amount).length, display.length);
130
- t1 = <Text dimColor={true}><Text color="startupAccent">{display.slice(0, highlightLen)}</Text>{display.slice(highlightLen)}</Text>;
131
- }
132
- $[0] = maxWidth;
133
- $[1] = twoLine;
134
- $[2] = t1;
135
- $[3] = t2;
136
- } else {
137
- t1 = $[2];
138
- t2 = $[3];
139
- }
140
- if (t2 !== Symbol.for("react.early_return_sentinel")) {
141
- return t2;
142
  }
143
- return t1;
 
 
 
 
 
 
 
 
 
 
144
  }
145
 
146
  /**
@@ -151,16 +132,15 @@ export function OverageCreditUpsell(t0) {
151
  * Char budgets: title ≀19, subtitle ≀48.
152
  */
153
  export function createOverageCreditFeed(): FeedConfig {
154
- const info = getCachedOverageCreditGrant();
155
- const amount = info ? formatGrantAmount(info) : null;
156
- const title = amount ? getFeedTitle(amount) : 'extra usage credit';
157
  return {
158
  title,
159
  lines: [],
160
  customContent: {
161
  content: <Text dimColor>{FEED_SUBTITLE}</Text>,
162
- width: Math.max(title.length, FEED_SUBTITLE.length)
163
- }
164
- };
165
  }
166
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZVN0YXRlIiwiVGV4dCIsImxvZ0V2ZW50IiwiZm9ybWF0R3JhbnRBbW91bnQiLCJnZXRDYWNoZWRPdmVyYWdlQ3JlZGl0R3JhbnQiLCJyZWZyZXNoT3ZlcmFnZUNyZWRpdEdyYW50Q2FjaGUiLCJnZXRHbG9iYWxDb25maWciLCJzYXZlR2xvYmFsQ29uZmlnIiwidHJ1bmNhdGUiLCJGZWVkQ29uZmlnIiwiTUFYX0lNUFJFU1NJT05TIiwiaXNFbGlnaWJsZUZvck92ZXJhZ2VDcmVkaXRHcmFudCIsImluZm8iLCJhdmFpbGFibGUiLCJncmFudGVkIiwic2hvdWxkU2hvd092ZXJhZ2VDcmVkaXRVcHNlbGwiLCJjb25maWciLCJoYXNWaXNpdGVkRXh0cmFVc2FnZSIsIm92ZXJhZ2VDcmVkaXRVcHNlbGxTZWVuQ291bnQiLCJtYXliZVJlZnJlc2hPdmVyYWdlQ3JlZGl0Q2FjaGUiLCJ1c2VTaG93T3ZlcmFnZUNyZWRpdFVwc2VsbCIsInNob3ciLCJfdGVtcCIsImluY3JlbWVudE92ZXJhZ2VDcmVkaXRVcHNlbGxTZWVuQ291bnQiLCJuZXdDb3VudCIsInByZXYiLCJzZWVuX2NvdW50IiwiZ2V0VXNhZ2VUZXh0IiwiYW1vdW50IiwiRkVFRF9TVUJUSVRMRSIsImdldEZlZWRUaXRsZSIsIlByb3BzIiwibWF4V2lkdGgiLCJ0d29MaW5lIiwiT3ZlcmFnZUNyZWRpdFVwc2VsbCIsInQwIiwiJCIsIl9jIiwidDEiLCJ0MiIsIlN5bWJvbCIsImZvciIsImJiMCIsInRpdGxlIiwidDMiLCJ0NCIsInRleHQiLCJkaXNwbGF5IiwiaGlnaGxpZ2h0TGVuIiwiTWF0aCIsIm1pbiIsImxlbmd0aCIsInNsaWNlIiwiY3JlYXRlT3ZlcmFnZUNyZWRpdEZlZWQiLCJsaW5lcyIsImN1c3RvbUNvbnRlbnQiLCJjb250ZW50Iiwid2lkdGgiLCJtYXgiXSwic291cmNlcyI6WyJPdmVyYWdlQ3JlZGl0VXBzZWxsLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBUZXh0IH0gZnJvbSAnLi4vLi4vaW5rLmpzJ1xuaW1wb3J0IHsgbG9nRXZlbnQgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hbmFseXRpY3MvaW5kZXguanMnXG5pbXBvcnQge1xuICBmb3JtYXRHcmFudEFtb3VudCxcbiAgZ2V0Q2FjaGVkT3ZlcmFnZUNyZWRpdEdyYW50LFxuICByZWZyZXNoT3ZlcmFnZUNyZWRpdEdyYW50Q2FjaGUsXG59IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FwaS9vdmVyYWdlQ3JlZGl0R3JhbnQuanMnXG5pbXBvcnQgeyBnZXRHbG9iYWxDb25maWcsIHNhdmVHbG9iYWxDb25maWcgfSBmcm9tICcuLi8uLi91dGlscy9jb25maWcuanMnXG5pbXBvcnQgeyB0cnVuY2F0ZSB9IGZyb20gJy4uLy4uL3V0aWxzL2Zvcm1hdC5qcydcbmltcG9ydCB0eXBlIHsgRmVlZENvbmZpZyB9IGZyb20gJy4vRmVlZC5qcydcblxuY29uc3QgTUFYX0lNUFJFU1NJT05TID0gM1xuXG4vKipcbiAqIFdoZXRoZXIgdG8gc2hvdyB0aGUgb3ZlcmFnZSBjcmVkaXQgdXBzZWxsIG9uIGFueSBzdXJmYWNlLlxuICpcbiAqIEVsaWdpYmlsaXR5IGNvbWVzIGVudGlyZWx5IGZyb20gdGhlIGJhY2tlbmQgR0VUIC9vdmVyYWdlX2NyZWRpdF9ncmFudFxuICogcmVzcG9uc2Ug4oCUIHRoZSBDTEkgZG9lc24ndCByZXBsaWNhdGUgdGllci90aHJlc2hvbGQvcm9sZSBjaGVja3MuIFRoZVxuICogYmFja2VuZCByZXR1cm5zIGF2YWlsYWJsZTogZmFsc2UgZm9yIFRlYW0gbWVtYmVycyB3aG8gYXJlbid0IGFkbWlucyxcbiAqIHNvIHRoZXkgZG9uJ3Qgc2VlIGFuIHVwc2VsbCB0aGV5IGNhbid0IGFjdCBvbi5cbiAqXG4gKiBpc0VsaWdpYmxlRm9yT3ZlcmFnZUNyZWRpdEdyYW50IOKAlCBqdXN0IHRoZSBiYWNrZW5kIGVsaWdpYmlsaXR5LiBVc2UgZm9yXG4gKiAgIHBlcnNpc3RlbnQgcmVmZXJlbmNlIHN1cmZhY2VzICgvdXNhZ2UpIHdoZXJlIHRoZSBpbmZvIHNob3VsZCBzaG93XG4gKiAgIHdoZW5ldmVyIGVsaWdpYmxlLCBubyBpbXByZXNzaW9uIGNhcC5cbiAqIHNob3VsZFNob3dPdmVyYWdlQ3JlZGl0VXBzZWxsIOKAlCBhZGRzIHRoZSAzLWltcHJlc3Npb24gY2FwIGFuZFxuICogICBoYXNWaXNpdGVkRXh0cmFVc2FnZSBkaXNtaXNzLiBVc2UgZm9yIHByb21vdGlvbmFsIHN1cmZhY2VzXG4gKiAgICh3ZWxjb21lIGZlZWQsIHRpcHMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFbGlnaWJsZUZvck92ZXJhZ2VDcmVkaXRHcmFudCgpOiBib29sZWFuIHtcbiAgY29uc3QgaW5mbyA9IGdldENhY2hlZE92ZXJhZ2VDcmVkaXRHcmFudCgpXG4gIGlmICghaW5mbyB8fCAhaW5mby5hdmFpbGFibGUgfHwgaW5mby5ncmFudGVkKSByZXR1cm4gZmFsc2VcbiAgcmV0dXJuIGZvcm1hdEdyYW50QW1vdW50KGluZm8pICE9PSBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRTaG93T3ZlcmFnZUNyZWRpdFVwc2VsbCgpOiBib29sZWFuIHtcbiAgaWYgKCFpc0VsaWdpYmxlRm9yT3ZlcmFnZUNyZWRpdEdyYW50KCkpIHJldHVybiBmYWxzZVxuXG4gIGNvbnN0IGNvbmZpZyA9IGdldEdsb2JhbENvbmZpZygpXG4gIGlmIChjb25maWcuaGFzVmlzaXRlZEV4dHJhVXNhZ2UpIHJldHVybiBmYWxzZVxuICBpZiAoKGNvbmZpZy5vdmVyYWdlQ3JlZGl0VXBzZWxsU2VlbkNvdW50ID8/IDApID49IE1BWF9JTVBSRVNTSU9OUylcbiAgICByZXR1cm4gZmFsc2VcblxuICByZXR1cm4gdHJ1ZVxufVxuXG4vKipcbiAqIEtpY2sgb2ZmIGEgYmFja2dyb3VuZCBmZXRjaCBpZiB0aGUgY2FjaGUgaXMgZW1wdHkuIFNhZmUgdG8gY2FsbFxuICogdW5jb25kaXRpb25hbGx5IG9uIG1vdW50IOKAlCBpdCBuby1vcHMgaWYgY2FjaGUgaXMgZnJlc2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXliZVJlZnJlc2hPdmVyYWdlQ3JlZGl0Q2FjaGUoKTogdm9pZCB7XG4gIGlmIChnZXRDYWNoZWRPdmVyYWdlQ3JlZGl0R3JhbnQoKSAhPT0gbnVsbCkgcmV0dXJuXG4gIHZvaWQgcmVmcmVzaE92ZXJhZ2VDcmVkaXRHcmFudENhY2hlKClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVNob3dPdmVyYWdlQ3JlZGl0VXBzZWxsKCk6IGJvb2xlYW4ge1xuICBjb25zdCBbc2hvd10gPSB1c2VTdGF0ZSgoKSA9PiB7XG4gICAgbWF5YmVSZWZyZXNoT3ZlcmFnZUNyZWRpdENhY2hlKClcbiAgICByZXR1cm4gc2hvdWxkU2hvd092ZXJhZ2VDcmVkaXRVcHNlbGwoKVxuICB9KVxuICByZXR1cm4gc2hvd1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5jcmVtZW50T3ZlcmFnZUNyZWRpdFVwc2VsbFNlZW5Db3VudCgpOiB2b2lkIHtcbiAgbGV0IG5ld0NvdW50ID0gMFxuICBzYXZlR2xvYmFsQ29uZmlnKHByZXYgPT4ge1xuICAgIG5ld0NvdW50ID0gKHByZXYub3ZlcmFnZUNyZWRpdFVwc2VsbFNlZW5Db3VudCA/PyAwKSArIDFcbiAgICByZXR1cm4ge1xuICAgICAgLi4ucHJldixcbiAgICAgIG92ZXJhZ2VDcmVkaXRVcHNlbGxTZWVuQ291bnQ6IG5ld0NvdW50LFxuICAgIH1cbiAgfSlcbiAgbG9nRXZlbnQoJ3Rlbmd1X292ZXJhZ2VfY3JlZGl0X3Vwc2VsbF9zaG93bicsIHsgc2Vlbl9jb3VudDogbmV3Q291bnQgfSlcbn1cblxuLy8gQ29weSBmcm9tIFwiT0MgJiBCdWxrIE92ZXJhZ2VzIGNvcHlcIiBkb2MgKCM2IOKAlCBDTEkgL3VzYWdlKVxuZnVuY3Rpb24gZ2V0VXNhZ2VUZXh0KGFtb3VudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2Ftb3VudH0gaW4gZXh0cmEgdXNhZ2UgZm9yIHRoaXJkLXBhcnR5IGFwcHMgwrcgL2V4dHJhLXVzYWdlYFxufVxuXG4vLyBDb3B5IGZyb20gXCJPQyAmIEJ1bGsgT3ZlcmFnZXMgY29weVwiIGRvYyAoIzQg4oCUIENMSSBXZWxjb21lIHNjcmVlbikuXG4vLyBDaGFyIGJ1ZGdldHM6IHRpdGxlIOKJpDE5LCBzdWJ0aXRsZSDiiaQ0OC5cbmNvbnN0IEZFRURfU1VCVElUTEUgPSAnT24gdXMuIFdvcmtzIG9uIHRoaXJkLXBhcnR5IGFwcHMgwrcgL2V4dHJhLXVzYWdlJ1xuXG5mdW5jdGlvbiBnZXRGZWVkVGl0bGUoYW1vdW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7YW1vdW50fSBpbiBleHRyYSB1c2FnZWBcbn1cblxudHlwZSBQcm9wcyA9IHsgbWF4V2lkdGg/OiBudW1iZXI7IHR3b0xpbmU/OiBib29sZWFuIH1cblxuZXhwb3J0IGZ1bmN0aW9uIE92ZXJhZ2VDcmVkaXRVcHNlbGwoe1xuICBtYXhXaWR0aCxcbiAgdHdvTGluZSxcbn06IFByb3BzKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgY29uc3QgaW5mbyA9IGdldENhY2hlZE92ZXJhZ2VDcmVkaXRHcmFudCgpXG4gIGlmICghaW5mbykgcmV0dXJuIG51bGxcbiAgY29uc3QgYW1vdW50ID0gZm9ybWF0R3JhbnRBbW91bnQoaW5mbylcbiAgaWYgKCFhbW91bnQpIHJldHVybiBudWxsXG5cbiAgaWYgKHR3b0xpbmUpIHtcbiAgICBjb25zdCB0aXRsZSA9IGdldEZlZWRUaXRsZShhbW91bnQpXG4gICAgcmV0dXJuIChcbiAgICAgIDw+XG4gICAgICAgIDxUZXh0IGNvbG9yPVwiY2xhdWRlXCI+XG4gICAgICAgICAge21heFdpZHRoID8gdHJ1bmNhdGUodGl0bGUsIG1heFdpZHRoKSA6IHRpdGxlfVxuICAgICAgICA8L1RleHQ+XG4gICAgICAgIDxUZXh0IGRpbUNvbG9yPlxuICAgICAgICAgIHttYXhXaWR0aCA/IHRydW5jYXRlKEZFRURfU1VCVElUTEUsIG1heFdpZHRoKSA6IEZFRURfU1VCVElUTEV9XG4gICAgICAgIDwvVGV4dD5cbiAgICAgIDwvPlxuICAgIClcbiAgfVxuXG4gIGNvbnN0IHRleHQgPSBnZXRVc2FnZVRleHQoYW1vdW50KVxuICBjb25zdCBkaXNwbGF5ID0gbWF4V2lkdGggPyB0cnVuY2F0ZSh0ZXh0LCBtYXhXaWR0aCkgOiB0ZXh0XG4gIGNvbnN0IGhpZ2hsaWdodExlbiA9IE1hdGgubWluKGdldEZlZWRUaXRsZShhbW91bnQpLmxlbmd0aCwgZGlzcGxheS5sZW5ndGgpXG5cbiAgcmV0dXJuIChcbiAgICA8VGV4dCBkaW1Db2xvcj5cbiAgICAgIDxUZXh0IGNvbG9yPVwiY2xhdWRlXCI+e2Rpc3BsYXkuc2xpY2UoMCwgaGlnaGxpZ2h0TGVuKX08L1RleHQ+XG4gICAgICB7ZGlzcGxheS5zbGljZShoaWdobGlnaHRMZW4pfVxuICAgIDwvVGV4dD5cbiAgKVxufVxuXG4vKipcbiAqIEZlZWQgY29uZmlnIGZvciB0aGUgaG9tZXNjcmVlbiByb3RhdGluZyBmZWVkLiBNaXJyb3JzXG4gKiBjcmVhdGVHdWVzdFBhc3Nlc0ZlZWQgaW4gZmVlZENvbmZpZ3MudHN4LlxuICpcbiAqIENvcHkgZnJvbSBcIk9DICYgQnVsayBPdmVyYWdlcyBjb3B5XCIgZG9jICgjNCDigJQgQ0xJIFdlbGNvbWUgc2NyZWVuKS5cbiAqIENoYXIgYnVkZ2V0czogdGl0bGUg4omkMTksIHN1YnRpdGxlIOKJpDQ4LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlT3ZlcmFnZUNyZWRpdEZlZWQoKTogRmVlZENvbmZpZyB7XG4gIGNvbnN0IGluZm8gPSBnZXRDYWNoZWRPdmVyYWdlQ3JlZGl0R3JhbnQoKVxuICBjb25zdCBhbW91bnQgPSBpbmZvID8gZm9ybWF0R3JhbnRBbW91bnQoaW5mbykgOiBudWxsXG4gIGNvbnN0IHRpdGxlID0gYW1vdW50ID8gZ2V0RmVlZFRpdGxlKGFtb3VudCkgOiAnZXh0cmEgdXNhZ2UgY3JlZGl0J1xuICByZXR1cm4ge1xuICAgIHRpdGxlLFxuICAgIGxpbmVzOiBbXSxcbiAgICBjdXN0b21Db250ZW50OiB7XG4gICAgICBjb250ZW50OiA8VGV4dCBkaW1Db2xvcj57RkVFRF9TVUJUSVRMRX08L1RleHQ+LFxuICAgICAgd2lkdGg6IE1hdGgubWF4KHRpdGxlLmxlbmd0aCwgRkVFRF9TVUJUSVRMRS5sZW5ndGgpLFxuICAgIH0sXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sS0FBS0EsS0FBSyxNQUFNLE9BQU87QUFDOUIsU0FBU0MsUUFBUSxRQUFRLE9BQU87QUFDaEMsU0FBU0MsSUFBSSxRQUFRLGNBQWM7QUFDbkMsU0FBU0MsUUFBUSxRQUFRLG1DQUFtQztBQUM1RCxTQUNFQyxpQkFBaUIsRUFDakJDLDJCQUEyQixFQUMzQkMsOEJBQThCLFFBQ3pCLDBDQUEwQztBQUNqRCxTQUFTQyxlQUFlLEVBQUVDLGdCQUFnQixRQUFRLHVCQUF1QjtBQUN6RSxTQUFTQyxRQUFRLFFBQVEsdUJBQXVCO0FBQ2hELGNBQWNDLFVBQVUsUUFBUSxXQUFXO0FBRTNDLE1BQU1DLGVBQWUsR0FBRyxDQUFDOztBQUV6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLFNBQVNDLCtCQUErQkEsQ0FBQSxDQUFFLEVBQUUsT0FBTyxDQUFDO0VBQ3pELE1BQU1DLElBQUksR0FBR1IsMkJBQTJCLENBQUMsQ0FBQztFQUMxQyxJQUFJLENBQUNRLElBQUksSUFBSSxDQUFDQSxJQUFJLENBQUNDLFNBQVMsSUFBSUQsSUFBSSxDQUFDRSxPQUFPLEVBQUUsT0FBTyxLQUFLO0VBQzFELE9BQU9YLGlCQUFpQixDQUFDUyxJQUFJLENBQUMsS0FBSyxJQUFJO0FBQ3pDO0FBRUEsT0FBTyxTQUFTRyw2QkFBNkJBLENBQUEsQ0FBRSxFQUFFLE9BQU8sQ0FBQztFQUN2RCxJQUFJLENBQUNKLCtCQUErQixDQUFDLENB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
 
1
+ import * as React from 'react'
2
+ import { useState } from 'react'
3
+ import { Text } from '../../ink.js'
4
+ import { logEvent } from '../../services/analytics/index.js'
5
+ import {
6
+ formatGrantAmount,
7
+ getCachedOverageCreditGrant,
8
+ refreshOverageCreditGrantCache,
9
+ } from '../../services/api/overageCreditGrant.js'
10
+ import { getGlobalConfig, saveGlobalConfig } from '../../utils/config.js'
11
+ import { truncate } from '../../utils/format.js'
12
+ import type { FeedConfig } from './Feed.js'
13
+
14
+ const MAX_IMPRESSIONS = 3
15
 
16
  /**
17
  * Whether to show the overage credit upsell on any surface.
 
29
  * (welcome feed, tips).
30
  */
31
  export function isEligibleForOverageCreditGrant(): boolean {
32
+ const info = getCachedOverageCreditGrant()
33
+ if (!info || !info.available || info.granted) return false
34
+ return formatGrantAmount(info) !== null
35
  }
36
+
37
  export function shouldShowOverageCreditUpsell(): boolean {
38
+ if (!isEligibleForOverageCreditGrant()) return false
39
+
40
+ const config = getGlobalConfig()
41
+ if (config.hasVisitedExtraUsage) return false
42
+ if ((config.overageCreditUpsellSeenCount ?? 0) >= MAX_IMPRESSIONS)
43
+ return false
44
+
45
+ return true
46
  }
47
 
48
  /**
 
50
  * unconditionally on mount β€” it no-ops if cache is fresh.
51
  */
52
  export function maybeRefreshOverageCreditCache(): void {
53
+ if (getCachedOverageCreditGrant() !== null) return
54
+ void refreshOverageCreditGrantCache()
 
 
 
 
55
  }
56
+
57
+ export function useShowOverageCreditUpsell(): boolean {
58
+ const [show] = useState(() => {
59
+ maybeRefreshOverageCreditCache()
60
+ return shouldShowOverageCreditUpsell()
61
+ })
62
+ return show
63
  }
64
+
65
  export function incrementOverageCreditUpsellSeenCount(): void {
66
+ let newCount = 0
67
  saveGlobalConfig(prev => {
68
+ newCount = (prev.overageCreditUpsellSeenCount ?? 0) + 1
69
  return {
70
  ...prev,
71
+ overageCreditUpsellSeenCount: newCount,
72
+ }
73
+ })
74
+ logEvent('tengu_overage_credit_upsell_shown', { seen_count: newCount })
 
 
75
  }
76
 
77
  // Copy from "OC & Bulk Overages copy" doc (#6 β€” CLI /usage)
78
  function getUsageText(amount: string): string {
79
+ return `${amount} in extra usage for third-party apps Β· /extra-usage`
80
  }
81
 
82
  // Copy from "OC & Bulk Overages copy" doc (#4 β€” CLI Welcome screen).
83
  // Char budgets: title ≀19, subtitle ≀48.
84
+ const FEED_SUBTITLE = 'On us. Works on third-party apps Β· /extra-usage'
85
+
86
  function getFeedTitle(amount: string): string {
87
+ return `${amount} in extra usage`
88
  }
89
+
90
+ type Props = { maxWidth?: number; twoLine?: boolean }
91
+
92
+ export function OverageCreditUpsell({
93
+ maxWidth,
94
+ twoLine,
95
+ }: Props): React.ReactNode {
96
+ const info = getCachedOverageCreditGrant()
97
+ if (!info) return null
98
+ const amount = formatGrantAmount(info)
99
+ if (!amount) return null
100
+
101
+ if (twoLine) {
102
+ const title = getFeedTitle(amount)
103
+ return (
104
+ <>
105
+ <Text color="claude">
106
+ {maxWidth ? truncate(title, maxWidth) : title}
107
+ </Text>
108
+ <Text dimColor>
109
+ {maxWidth ? truncate(FEED_SUBTITLE, maxWidth) : FEED_SUBTITLE}
110
+ </Text>
111
+ </>
112
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
113
  }
114
+
115
+ const text = getUsageText(amount)
116
+ const display = maxWidth ? truncate(text, maxWidth) : text
117
+ const highlightLen = Math.min(getFeedTitle(amount).length, display.length)
118
+
119
+ return (
120
+ <Text dimColor>
121
+ <Text color="claude">{display.slice(0, highlightLen)}</Text>
122
+ {display.slice(highlightLen)}
123
+ </Text>
124
+ )
125
  }
126
 
127
  /**
 
132
  * Char budgets: title ≀19, subtitle ≀48.
133
  */
134
  export function createOverageCreditFeed(): FeedConfig {
135
+ const info = getCachedOverageCreditGrant()
136
+ const amount = info ? formatGrantAmount(info) : null
137
+ const title = amount ? getFeedTitle(amount) : 'extra usage credit'
138
  return {
139
  title,
140
  lines: [],
141
  customContent: {
142
  content: <Text dimColor>{FEED_SUBTITLE}</Text>,
143
+ width: Math.max(title.length, FEED_SUBTITLE.length),
144
+ },
145
+ }
146
  }
 
src/components/LogoV2/VoiceModeNotice.tsx CHANGED
@@ -1,68 +1,51 @@
1
- import { c as _c } from "react/compiler-runtime";
2
- import { feature } from 'bun:bundle';
3
- import * as React from 'react';
4
- import { useEffect, useState } from 'react';
5
- import { Box, Text } from '../../ink.js';
6
- import { getGlobalConfig, saveGlobalConfig } from '../../utils/config.js';
7
- import { getInitialSettings } from '../../utils/settings/settings.js';
8
- import { isVoiceModeEnabled } from '../../voice/voiceModeEnabled.js';
9
- import { AnimatedAsterisk } from './AnimatedAsterisk.js';
10
- import { shouldShowOpus1mMergeNotice } from './Opus1mMergeNotice.js';
11
- const MAX_SHOW_COUNT = 3;
12
- export function VoiceModeNotice() {
13
- const $ = _c(1);
14
- let t0;
15
- if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
16
- t0 = feature("VOICE_MODE") ? <VoiceModeNoticeInner /> : null;
17
- $[0] = t0;
18
- } else {
19
- t0 = $[0];
20
- }
21
- return t0;
22
  }
23
- function VoiceModeNoticeInner() {
24
- const $ = _c(4);
25
- const [show] = useState(_temp);
26
- let t0;
27
- let t1;
28
- if ($[0] !== show) {
29
- t0 = () => {
30
- if (!show) {
31
- return;
32
- }
33
- const newCount = (getGlobalConfig().voiceNoticeSeenCount ?? 0) + 1;
34
- saveGlobalConfig(prev => {
35
- if ((prev.voiceNoticeSeenCount ?? 0) >= newCount) {
36
- return prev;
37
- }
38
- return {
39
- ...prev,
40
- voiceNoticeSeenCount: newCount
41
- };
42
- });
43
- };
44
- t1 = [show];
45
- $[0] = show;
46
- $[1] = t0;
47
- $[2] = t1;
48
- } else {
49
- t0 = $[1];
50
- t1 = $[2];
51
- }
52
- useEffect(t0, t1);
53
- if (!show) {
54
- return null;
55
- }
56
- let t2;
57
- if ($[3] === Symbol.for("react.memo_cache_sentinel")) {
58
- t2 = <Box paddingLeft={2}><AnimatedAsterisk /><Text dimColor={true}> Voice mode is now available Β· /voice to enable</Text></Box>;
59
- $[3] = t2;
60
- } else {
61
- t2 = $[3];
62
- }
63
- return t2;
64
  }
65
- function _temp() {
66
- return isVoiceModeEnabled() && getInitialSettings().voiceEnabled !== true && (getGlobalConfig().voiceNoticeSeenCount ?? 0) < MAX_SHOW_COUNT && !shouldShowOpus1mMergeNotice();
67
- }
68
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmZWF0dXJlIiwiUmVhY3QiLCJ1c2VFZmZlY3QiLCJ1c2VTdGF0ZSIsIkJveCIsIlRleHQiLCJnZXRHbG9iYWxDb25maWciLCJzYXZlR2xvYmFsQ29uZmlnIiwiZ2V0SW5pdGlhbFNldHRpbmdzIiwiaXNWb2ljZU1vZGVFbmFibGVkIiwiQW5pbWF0ZWRBc3RlcmlzayIsInNob3VsZFNob3dPcHVzMW1NZXJnZU5vdGljZSIsIk1BWF9TSE9XX0NPVU5UIiwiVm9pY2VNb2RlTm90aWNlIiwiJCIsIl9jIiwidDAiLCJTeW1ib2wiLCJmb3IiLCJWb2ljZU1vZGVOb3RpY2VJbm5lciIsInNob3ciLCJfdGVtcCIsInQxIiwibmV3Q291bnQiLCJ2b2ljZU5vdGljZVNlZW5Db3VudCIsInByZXYiLCJ0MiIsInZvaWNlRW5hYmxlZCJdLCJzb3VyY2VzIjpbIlZvaWNlTW9kZU5vdGljZS50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZmVhdHVyZSB9IGZyb20gJ2J1bjpidW5kbGUnXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IEJveCwgVGV4dCB9IGZyb20gJy4uLy4uL2luay5qcydcbmltcG9ydCB7IGdldEdsb2JhbENvbmZpZywgc2F2ZUdsb2JhbENvbmZpZyB9IGZyb20gJy4uLy4uL3V0aWxzL2NvbmZpZy5qcydcbmltcG9ydCB7IGdldEluaXRpYWxTZXR0aW5ncyB9IGZyb20gJy4uLy4uL3V0aWxzL3NldHRpbmdzL3NldHRpbmdzLmpzJ1xuaW1wb3J0IHsgaXNWb2ljZU1vZGVFbmFibGVkIH0gZnJvbSAnLi4vLi4vdm9pY2Uvdm9pY2VNb2RlRW5hYmxlZC5qcydcbmltcG9ydCB7IEFuaW1hdGVkQXN0ZXJpc2sgfSBmcm9tICcuL0FuaW1hdGVkQXN0ZXJpc2suanMnXG5pbXBvcnQgeyBzaG91bGRTaG93T3B1czFtTWVyZ2VOb3RpY2UgfSBmcm9tICcuL09wdXMxbU1lcmdlTm90aWNlLmpzJ1xuXG5jb25zdCBNQVhfU0hPV19DT1VOVCA9IDNcblxuZXhwb3J0IGZ1bmN0aW9uIFZvaWNlTW9kZU5vdGljZSgpOiBSZWFjdC5SZWFjdE5vZGUge1xuICAvLyBQb3NpdGl2ZSB0ZXJuYXJ5IHBhdHRlcm4g4oCUIHNlZSBkb2NzL2ZlYXR1cmUtZ2F0aW5nLm1kLlxuICAvLyBBbGwgc3RyaW5ncyBtdXN0IGJlIGluc2lkZSB0aGUgZ3VhcmRlZCBicmFuY2ggZm9yIGRlYWQtY29kZSBlbGltaW5hdGlvbi5cbiAgcmV0dXJuIGZlYXR1cmUoJ1ZPSUNFX01PREUnKSA/IDxWb2ljZU1vZGVOb3RpY2VJbm5lciAvPiA6IG51bGxcbn1cblxuZnVuY3Rpb24gVm9pY2VNb2RlTm90aWNlSW5uZXIoKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgLy8gQ2FwdHVyZSBlbGlnaWJpbGl0eSBvbmNlIGF0IG1vdW50IOKAlCBubyByZWFjdGl2ZSBzdWJzY3JpcHRpb25zLiBUaGlzIHNpdHNcbiAgLy8gYXQgdGhlIHRvcCBvZiB0aGUgbWVzc2FnZSBsaXN0IGFuZCBlbnRlcnMgc2Nyb2xsYmFjayBxdWlja2x5OyBhbnlcbiAgLy8gcmUtcmVuZGVyIGFmdGVyIGl0J3MgaW4gc2Nyb2xsYmFjayB3b3VsZCBmb3JjZSBhIGZ1bGwgdGVybWluYWwgcmVzZXQuXG4gIC8vIElmIHRoZSB1c2VyIHJ1bnMgL3ZvaWNlIHRoaXMgc2Vzc2lvbiwgdGhlIG5vdGljZSBzdGF5cyB2aXNpYmxlOyBpdCB3b24ndFxuICAvLyBzaG93IG5leHQgc2Vzc2lvbiBzaW5jZSB2b2ljZUVuYWJsZWQgd2lsbCBiZSB0cnVlIG9uIGRpc2suXG4gIGNvbnN0IFtzaG93XSA9IHVzZVN0YXRlKFxuICAgICgpID0+XG4gICAgICBpc1ZvaWNlTW9kZUVuYWJsZWQoKSAmJlxuICAgICAgZ2V0SW5pdGlhbFNldHRpbmdzKCkudm9pY2VFbmFibGVkICE9PSB0cnVlICYmXG4gICAgICAoZ2V0R2xvYmFsQ29uZmlnKCkudm9pY2VOb3RpY2VTZWVuQ291bnQgPz8gMCkgPCBNQVhfU0hPV19DT1VOVCAmJlxuICAgICAgIXNob3VsZFNob3dPcHVzMW1NZXJnZU5vdGljZSgpLFxuICApXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIXNob3cpIHJldHVyblxuICAgIC8vIENhcHR1cmUgb3V0c2lkZSB0aGUgdXBkYXRlciBzbyBTdHJpY3RNb2RlJ3Mgc2Vjb25kIGludm9jYXRpb24gaXMgYSBuby1vcC5cbiAgICBjb25zdCBuZXdDb3VudCA9IChnZXRHbG9iYWxDb25maWcoKS52b2ljZU5vdGljZVNlZW5Db3VudCA/PyAwKSArIDFcbiAgICBzYXZlR2xvYmFsQ29uZmlnKHByZXYgPT4ge1xuICAgICAgaWYgKChwcmV2LnZvaWNlTm90aWNlU2VlbkNvdW50ID8/IDApID49IG5ld0NvdW50KSByZXR1cm4gcHJldlxuICAgICAgcmV0dXJuIHsgLi4ucHJldiwgdm9pY2VOb3RpY2VTZWVuQ291bnQ6IG5ld0NvdW50IH1cbiAgICB9KVxuICB9LCBbc2hvd10pXG5cbiAgaWYgKCFzaG93KSByZXR1cm4gbnVsbFxuXG4gIHJldHVybiAoXG4gICAgPEJveCBwYWRkaW5nTGVmdD17Mn0+XG4gICAgICA8QW5pbWF0ZWRBc3RlcmlzayAvPlxuICAgICAgPFRleHQgZGltQ29sb3I+IFZvaWNlIG1vZGUgaXMgbm93IGF2YWlsYWJsZSDCtyAvdm9pY2UgdG8gZW5hYmxlPC9UZXh0PlxuICAgIDwvQm94PlxuICApXG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQSxTQUFTQSxPQUFPLFFBQVEsWUFBWTtBQUNwQyxPQUFPLEtBQUtDLEtBQUssTUFBTSxPQUFPO0FBQzlCLFNBQVNDLFNBQVMsRUFBRUMsUUFBUSxRQUFRLE9BQU87QUFDM0MsU0FBU0MsR0FBRyxFQUFFQyxJQUFJLFFBQVEsY0FBYztBQUN4QyxTQUFTQyxlQUFlLEVBQUVDLGdCQUFnQixRQUFRLHVCQUF1QjtBQUN6RSxTQUFTQyxrQkFBa0IsUUFBUSxrQ0FBa0M7QUFDckUsU0FBU0Ms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
 
1
+ import { feature } from 'bun:bundle'
2
+ import * as React from 'react'
3
+ import { useEffect, useState } from 'react'
4
+ import { Box, Text } from '../../ink.js'
5
+ import { getGlobalConfig, saveGlobalConfig } from '../../utils/config.js'
6
+ import { getInitialSettings } from '../../utils/settings/settings.js'
7
+ import { isVoiceModeEnabled } from '../../voice/voiceModeEnabled.js'
8
+ import { AnimatedAsterisk } from './AnimatedAsterisk.js'
9
+ import { shouldShowOpus1mMergeNotice } from './Opus1mMergeNotice.js'
10
+
11
+ const MAX_SHOW_COUNT = 3
12
+
13
+ export function VoiceModeNotice(): React.ReactNode {
14
+ // Positive ternary pattern β€” see docs/feature-gating.md.
15
+ // All strings must be inside the guarded branch for dead-code elimination.
16
+ return feature('VOICE_MODE') ? <VoiceModeNoticeInner /> : null
 
 
 
 
 
17
  }
18
+
19
+ function VoiceModeNoticeInner(): React.ReactNode {
20
+ // Capture eligibility once at mount β€” no reactive subscriptions. This sits
21
+ // at the top of the message list and enters scrollback quickly; any
22
+ // re-render after it's in scrollback would force a full terminal reset.
23
+ // If the user runs /voice this session, the notice stays visible; it won't
24
+ // show next session since voiceEnabled will be true on disk.
25
+ const [show] = useState(
26
+ () =>
27
+ isVoiceModeEnabled() &&
28
+ getInitialSettings().voiceEnabled !== true &&
29
+ (getGlobalConfig().voiceNoticeSeenCount ?? 0) < MAX_SHOW_COUNT &&
30
+ !shouldShowOpus1mMergeNotice(),
31
+ )
32
+
33
+ useEffect(() => {
34
+ if (!show) return
35
+ // Capture outside the updater so StrictMode's second invocation is a no-op.
36
+ const newCount = (getGlobalConfig().voiceNoticeSeenCount ?? 0) + 1
37
+ saveGlobalConfig(prev => {
38
+ if ((prev.voiceNoticeSeenCount ?? 0) >= newCount) return prev
39
+ return { ...prev, voiceNoticeSeenCount: newCount }
40
+ })
41
+ }, [show])
42
+
43
+ if (!show) return null
44
+
45
+ return (
46
+ <Box paddingLeft={2}>
47
+ <AnimatedAsterisk />
48
+ <Text dimColor> Voice mode is now available Β· /voice to enable</Text>
49
+ </Box>
50
+ )
 
 
 
 
 
 
 
 
51
  }
 
 
 
 
src/components/LogoV2/WelcomeV2.tsx CHANGED
@@ -1,433 +1,326 @@
1
- import { c as _c } from "react/compiler-runtime";
2
- import React from 'react';
3
- import { Box, Text, useTheme } from 'src/ink.js';
4
- import { env } from '../../utils/env.js';
5
- const WELCOME_V2_WIDTH = 58;
6
- export function WelcomeV2() {
7
- const $ = _c(35);
8
- const [theme] = useTheme();
9
- if (env.terminal === "Apple_Terminal") {
10
- let t0;
11
- if ($[0] !== theme) {
12
- t0 = <AppleTerminalWelcomeV2 theme={theme} welcomeMessage="Welcome to VersperClaw" />;
13
- $[0] = theme;
14
- $[1] = t0;
15
- } else {
16
- t0 = $[1];
17
- }
18
- return t0;
19
  }
20
- if (["light", "light-daltonized", "light-ansi"].includes(theme)) {
21
- let t0;
22
- let t1;
23
- let t2;
24
- let t3;
25
- let t4;
26
- let t5;
27
- let t6;
28
- let t7;
29
- let t8;
30
- if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
31
- t0 = <Text><Text color="startupAccent">{"Welcome to VersperClaw"} </Text><Text dimColor={true}>v{MACRO.VERSION} </Text></Text>;
32
- t1 = <Text>{"\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026"}</Text>;
33
- t2 = <Text>{" "}</Text>;
34
- t3 = <Text>{" "}</Text>;
35
- t4 = <Text>{" "}</Text>;
36
- t5 = <Text>{" \u2591\u2591\u2591\u2591\u2591\u2591 "}</Text>;
37
- t6 = <Text>{" \u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591 "}</Text>;
38
- t7 = <Text>{" \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591 "}</Text>;
39
- t8 = <Text>{" "}</Text>;
40
- $[2] = t0;
41
- $[3] = t1;
42
- $[4] = t2;
43
- $[5] = t3;
44
- $[6] = t4;
45
- $[7] = t5;
46
- $[8] = t6;
47
- $[9] = t7;
48
- $[10] = t8;
49
- } else {
50
- t0 = $[2];
51
- t1 = $[3];
52
- t2 = $[4];
53
- t3 = $[5];
54
- t4 = $[6];
55
- t5 = $[7];
56
- t6 = $[8];
57
- t7 = $[9];
58
- t8 = $[10];
59
- }
60
- let t9;
61
- if ($[11] === Symbol.for("react.memo_cache_sentinel")) {
62
- t9 = <Text><Text dimColor={true}>{" \u2591\u2591\u2591\u2591"}</Text><Text>{" \u2588\u2588 "}</Text></Text>;
63
- $[11] = t9;
64
- } else {
65
- t9 = $[11];
66
- }
67
- let t10;
68
- let t11;
69
- if ($[12] === Symbol.for("react.memo_cache_sentinel")) {
70
- t10 = <Text><Text dimColor={true}>{" \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591"}</Text><Text>{" \u2588\u2588\u2592\u2592\u2588\u2588 "}</Text></Text>;
71
- t11 = <Text>{" \u2592\u2592 \u2588\u2588 \u2592"}</Text>;
72
- $[12] = t10;
73
- $[13] = t11;
74
- } else {
75
- t10 = $[12];
76
- t11 = $[13];
77
- }
78
- let t12;
79
- if ($[14] === Symbol.for("react.memo_cache_sentinel")) {
80
- t12 = <Text>{" "}<Text color="clawd_body"> β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ </Text>{" \u2592\u2592\u2591\u2591\u2592\u2592 \u2592 \u2592\u2592"}</Text>;
81
- $[14] = t12;
82
- } else {
83
- t12 = $[14];
84
- }
85
- let t13;
86
- if ($[15] === Symbol.for("react.memo_cache_sentinel")) {
87
- t13 = <Text>{" "}<Text color="clawd_body" backgroundColor="clawd_background">β–ˆβ–ˆβ–„β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–„β–ˆβ–ˆ</Text>{" \u2592\u2592 \u2592\u2592 "}</Text>;
88
- $[15] = t13;
89
- } else {
90
- t13 = $[15];
91
- }
92
- let t14;
93
- if ($[16] === Symbol.for("react.memo_cache_sentinel")) {
94
- t14 = <Text>{" "}<Text color="clawd_body"> β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ </Text>{" \u2591 \u2592 "}</Text>;
95
- $[16] = t14;
96
- } else {
97
- t14 = $[16];
98
- }
99
- let t15;
100
- if ($[17] === Symbol.for("react.memo_cache_sentinel")) {
101
- t15 = <Box width={WELCOME_V2_WIDTH}><Text>{t0}{t1}{t2}{t3}{t4}{t5}{t6}{t7}{t8}{t9}{t10}{t11}{t12}{t13}{t14}<Text>{"\u2026\u2026\u2026\u2026\u2026\u2026\u2026"}<Text color="clawd_body">{"\u2588 \u2588 \u2588 \u2588"}</Text>{"\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2591\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2592\u2026\u2026\u2026\u2026"}</Text></Text></Box>;
102
- $[17] = t15;
103
- } else {
104
- t15 = $[17];
105
- }
106
- return t15;
107
  }
108
- let t0;
109
- let t1;
110
- let t2;
111
- let t3;
112
- let t4;
113
- let t5;
114
- let t6;
115
- if ($[18] === Symbol.for("react.memo_cache_sentinel")) {
116
- t0 = <Text><Text color="startupAccent">{"Welcome to VersperClaw"} </Text><Text dimColor={true}>v{MACRO.VERSION} </Text></Text>;
117
- t1 = <Text>{"\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026"}</Text>;
118
- t2 = <Text>{" "}</Text>;
119
- t3 = <Text>{" * \u2588\u2588\u2588\u2588\u2588\u2593\u2593\u2591 "}</Text>;
120
- t4 = <Text>{" * \u2588\u2588\u2588\u2593\u2591 \u2591\u2591 "}</Text>;
121
- t5 = <Text>{" \u2591\u2591\u2591\u2591\u2591\u2591 \u2588\u2588\u2588\u2593\u2591 "}</Text>;
122
- t6 = <Text>{" \u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591 \u2588\u2588\u2588\u2593\u2591 "}</Text>;
123
- $[18] = t0;
124
- $[19] = t1;
125
- $[20] = t2;
126
- $[21] = t3;
127
- $[22] = t4;
128
- $[23] = t5;
129
- $[24] = t6;
130
- } else {
131
- t0 = $[18];
132
- t1 = $[19];
133
- t2 = $[20];
134
- t3 = $[21];
135
- t4 = $[22];
136
- t5 = $[23];
137
- t6 = $[24];
138
- }
139
- let t10;
140
- let t11;
141
- let t7;
142
- let t8;
143
- let t9;
144
- if ($[25] === Symbol.for("react.memo_cache_sentinel")) {
145
- t7 = <Text><Text>{" \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591 "}</Text><Text bold={true}>*</Text><Text>{" \u2588\u2588\u2593\u2591\u2591 \u2593 "}</Text></Text>;
146
- t8 = <Text>{" \u2591\u2593\u2593\u2588\u2588\u2588\u2593\u2593\u2591 "}</Text>;
147
- t9 = <Text dimColor={true}>{" * \u2591\u2591\u2591\u2591 "}</Text>;
148
- t10 = <Text dimColor={true}>{" \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591 "}</Text>;
149
- t11 = <Text dimColor={true}>{" \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591 "}</Text>;
150
- $[25] = t10;
151
- $[26] = t11;
152
- $[27] = t7;
153
- $[28] = t8;
154
- $[29] = t9;
155
- } else {
156
- t10 = $[25];
157
- t11 = $[26];
158
- t7 = $[27];
159
- t8 = $[28];
160
- t9 = $[29];
161
- }
162
- let t12;
163
- if ($[30] === Symbol.for("react.memo_cache_sentinel")) {
164
- t12 = <Text color="clawd_body"> β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ </Text>;
165
- $[30] = t12;
166
- } else {
167
- t12 = $[30];
168
- }
169
- let t13;
170
- if ($[31] === Symbol.for("react.memo_cache_sentinel")) {
171
- t13 = <Text>{" "}{t12}{" "}<Text dimColor={true}>*</Text><Text> </Text></Text>;
172
- $[31] = t13;
173
- } else {
174
- t13 = $[31];
175
- }
176
- let t14;
177
- if ($[32] === Symbol.for("react.memo_cache_sentinel")) {
178
- t14 = <Text>{" "}<Text color="clawd_body">β–ˆβ–ˆβ–„β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–„β–ˆβ–ˆ</Text><Text>{" "}</Text><Text bold={true}>*</Text><Text>{" "}</Text></Text>;
179
- $[32] = t14;
180
- } else {
181
- t14 = $[32];
182
- }
183
- let t15;
184
- if ($[33] === Symbol.for("react.memo_cache_sentinel")) {
185
- t15 = <Text>{" "}<Text color="clawd_body"> β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ </Text>{" * "}</Text>;
186
- $[33] = t15;
187
- } else {
188
- t15 = $[33];
189
- }
190
- let t16;
191
- if ($[34] === Symbol.for("react.memo_cache_sentinel")) {
192
- t16 = <Box width={WELCOME_V2_WIDTH}><Text>{t0}{t1}{t2}{t3}{t4}{t5}{t6}{t7}{t8}{t9}{t10}{t11}{t13}{t14}{t15}<Text>{"\u2026\u2026\u2026\u2026\u2026\u2026\u2026"}<Text color="clawd_body">{"\u2588 \u2588 \u2588 \u2588"}</Text>{"\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026"}</Text></Text></Box>;
193
- $[34] = t16;
194
- } else {
195
- t16 = $[34];
196
- }
197
- return t16;
198
  }
 
199
  type AppleTerminalWelcomeV2Props = {
200
- theme: string;
201
- welcomeMessage: string;
202
- };
203
- function AppleTerminalWelcomeV2(t0) {
204
- const $ = _c(44);
205
- const {
 
 
 
206
  theme,
207
- welcomeMessage
208
- } = t0;
209
- const isLightTheme = ["light", "light-daltonized", "light-ansi"].includes(theme);
210
  if (isLightTheme) {
211
- let t1;
212
- if ($[0] !== welcomeMessage) {
213
- t1 = <Text color="startupAccent">{welcomeMessage} </Text>;
214
- $[0] = welcomeMessage;
215
- $[1] = t1;
216
- } else {
217
- t1 = $[1];
218
- }
219
- let t2;
220
- if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
221
- t2 = <Text dimColor={true}>v{MACRO.VERSION} </Text>;
222
- $[2] = t2;
223
- } else {
224
- t2 = $[2];
225
- }
226
- let t3;
227
- if ($[3] !== t1) {
228
- t3 = <Text>{t1}{t2}</Text>;
229
- $[3] = t1;
230
- $[4] = t3;
231
- } else {
232
- t3 = $[4];
233
- }
234
- let t10;
235
- let t11;
236
- let t4;
237
- let t5;
238
- let t6;
239
- let t7;
240
- let t8;
241
- let t9;
242
- if ($[5] === Symbol.for("react.memo_cache_sentinel")) {
243
- t4 = <Text>{"\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026"}</Text>;
244
- t5 = <Text>{" "}</Text>;
245
- t6 = <Text>{" "}</Text>;
246
- t7 = <Text>{" "}</Text>;
247
- t8 = <Text>{" \u2591\u2591\u2591\u2591\u2591\u2591 "}</Text>;
248
- t9 = <Text>{" \u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591 "}</Text>;
249
- t10 = <Text>{" \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591 "}</Text>;
250
- t11 = <Text>{" "}</Text>;
251
- $[5] = t10;
252
- $[6] = t11;
253
- $[7] = t4;
254
- $[8] = t5;
255
- $[9] = t6;
256
- $[10] = t7;
257
- $[11] = t8;
258
- $[12] = t9;
259
- } else {
260
- t10 = $[5];
261
- t11 = $[6];
262
- t4 = $[7];
263
- t5 = $[8];
264
- t6 = $[9];
265
- t7 = $[10];
266
- t8 = $[11];
267
- t9 = $[12];
268
- }
269
- let t12;
270
- if ($[13] === Symbol.for("react.memo_cache_sentinel")) {
271
- t12 = <Text><Text dimColor={true}>{" \u2591\u2591\u2591\u2591"}</Text><Text>{" \u2588\u2588 "}</Text></Text>;
272
- $[13] = t12;
273
- } else {
274
- t12 = $[13];
275
- }
276
- let t13;
277
- let t14;
278
- let t15;
279
- if ($[14] === Symbol.for("react.memo_cache_sentinel")) {
280
- t13 = <Text><Text dimColor={true}>{" \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591"}</Text><Text>{" \u2588\u2588\u2592\u2592\u2588\u2588 "}</Text></Text>;
281
- t14 = <Text>{" \u2592\u2592 \u2588\u2588 \u2592"}</Text>;
282
- t15 = <Text>{" \u2592\u2592\u2591\u2591\u2592\u2592 \u2592 \u2592\u2592"}</Text>;
283
- $[14] = t13;
284
- $[15] = t14;
285
- $[16] = t15;
286
- } else {
287
- t13 = $[14];
288
- t14 = $[15];
289
- t15 = $[16];
290
- }
291
- let t16;
292
- if ($[17] === Symbol.for("react.memo_cache_sentinel")) {
293
- t16 = <Text>{" "}<Text color="clawd_body">β–—</Text><Text color="clawd_background" backgroundColor="clawd_body">{" "}β–—{" "}β––{" "}</Text><Text color="clawd_body">β––</Text>{" \u2592\u2592 \u2592\u2592 "}</Text>;
294
- $[17] = t16;
295
- } else {
296
- t16 = $[17];
297
- }
298
- let t17;
299
- if ($[18] === Symbol.for("react.memo_cache_sentinel")) {
300
- t17 = <Text>{" "}<Text backgroundColor="clawd_body">{" ".repeat(9)}</Text>{" \u2591 \u2592 "}</Text>;
301
- $[18] = t17;
302
- } else {
303
- t17 = $[18];
304
- }
305
- let t18;
306
- if ($[19] === Symbol.for("react.memo_cache_sentinel")) {
307
- t18 = <Text>{"\u2026\u2026\u2026\u2026\u2026\u2026\u2026"}<Text backgroundColor="clawd_body"> </Text><Text> </Text><Text backgroundColor="clawd_body"> </Text><Text>{" "}</Text><Text backgroundColor="clawd_body"> </Text><Text> </Text><Text backgroundColor="clawd_body"> </Text>{"\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2591\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2592\u2026\u2026\u2026\u2026"}</Text>;
308
- $[19] = t18;
309
- } else {
310
- t18 = $[19];
311
- }
312
- let t19;
313
- if ($[20] !== t3) {
314
- t19 = <Box width={WELCOME_V2_WIDTH}><Text>{t3}{t4}{t5}{t6}{t7}{t8}{t9}{t10}{t11}{t12}{t13}{t14}{t15}{t16}{t17}{t18}</Text></Box>;
315
- $[20] = t3;
316
- $[21] = t19;
317
- } else {
318
- t19 = $[21];
319
- }
320
- return t19;
321
- }
322
- let t1;
323
- if ($[22] !== welcomeMessage) {
324
- t1 = <Text color="startupAccent">{welcomeMessage} </Text>;
325
- $[22] = welcomeMessage;
326
- $[23] = t1;
327
- } else {
328
- t1 = $[23];
329
- }
330
- let t2;
331
- if ($[24] === Symbol.for("react.memo_cache_sentinel")) {
332
- t2 = <Text dimColor={true}>v{MACRO.VERSION} </Text>;
333
- $[24] = t2;
334
- } else {
335
- t2 = $[24];
336
- }
337
- let t3;
338
- if ($[25] !== t1) {
339
- t3 = <Text>{t1}{t2}</Text>;
340
- $[25] = t1;
341
- $[26] = t3;
342
- } else {
343
- t3 = $[26];
344
- }
345
- let t4;
346
- let t5;
347
- let t6;
348
- let t7;
349
- let t8;
350
- let t9;
351
- if ($[27] === Symbol.for("react.memo_cache_sentinel")) {
352
- t4 = <Text>{"\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026"}</Text>;
353
- t5 = <Text>{" "}</Text>;
354
- t6 = <Text>{" * \u2588\u2588\u2588\u2588\u2588\u2593\u2593\u2591 "}</Text>;
355
- t7 = <Text>{" * \u2588\u2588\u2588\u2593\u2591 \u2591\u2591 "}</Text>;
356
- t8 = <Text>{" \u2591\u2591\u2591\u2591\u2591\u2591 \u2588\u2588\u2588\u2593\u2591 "}</Text>;
357
- t9 = <Text>{" \u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591 \u2588\u2588\u2588\u2593\u2591 "}</Text>;
358
- $[27] = t4;
359
- $[28] = t5;
360
- $[29] = t6;
361
- $[30] = t7;
362
- $[31] = t8;
363
- $[32] = t9;
364
- } else {
365
- t4 = $[27];
366
- t5 = $[28];
367
- t6 = $[29];
368
- t7 = $[30];
369
- t8 = $[31];
370
- t9 = $[32];
371
- }
372
- let t10;
373
- let t11;
374
- let t12;
375
- let t13;
376
- let t14;
377
- if ($[33] === Symbol.for("react.memo_cache_sentinel")) {
378
- t10 = <Text><Text>{" \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591 "}</Text><Text bold={true}>*</Text><Text>{" \u2588\u2588\u2593\u2591\u2591 \u2593 "}</Text></Text>;
379
- t11 = <Text>{" \u2591\u2593\u2593\u2588\u2588\u2588\u2593\u2593\u2591 "}</Text>;
380
- t12 = <Text dimColor={true}>{" * \u2591\u2591\u2591\u2591 "}</Text>;
381
- t13 = <Text dimColor={true}>{" \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591 "}</Text>;
382
- t14 = <Text dimColor={true}>{" \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591 "}</Text>;
383
- $[33] = t10;
384
- $[34] = t11;
385
- $[35] = t12;
386
- $[36] = t13;
387
- $[37] = t14;
388
- } else {
389
- t10 = $[33];
390
- t11 = $[34];
391
- t12 = $[35];
392
- t13 = $[36];
393
- t14 = $[37];
394
- }
395
- let t15;
396
- if ($[38] === Symbol.for("react.memo_cache_sentinel")) {
397
- t15 = <Text>{" "}<Text dimColor={true}>*</Text><Text> </Text></Text>;
398
- $[38] = t15;
399
- } else {
400
- t15 = $[38];
401
- }
402
- let t16;
403
- if ($[39] === Symbol.for("react.memo_cache_sentinel")) {
404
- t16 = <Text>{" "}<Text color="clawd_body">β–—</Text><Text color="clawd_background" backgroundColor="clawd_body">{" "}β–—{" "}β––{" "}</Text><Text color="clawd_body">β––</Text><Text>{" "}</Text><Text bold={true}>*</Text><Text>{" "}</Text></Text>;
405
- $[39] = t16;
406
- } else {
407
- t16 = $[39];
408
- }
409
- let t17;
410
- if ($[40] === Symbol.for("react.memo_cache_sentinel")) {
411
- t17 = <Text>{" "}<Text backgroundColor="clawd_body">{" ".repeat(9)}</Text>{" * "}</Text>;
412
- $[40] = t17;
413
- } else {
414
- t17 = $[40];
415
- }
416
- let t18;
417
- if ($[41] === Symbol.for("react.memo_cache_sentinel")) {
418
- t18 = <Text>{"\u2026\u2026\u2026\u2026\u2026\u2026\u2026"}<Text backgroundColor="clawd_body"> </Text><Text> </Text><Text backgroundColor="clawd_body"> </Text><Text>{" "}</Text><Text backgroundColor="clawd_body"> </Text><Text> </Text><Text backgroundColor="clawd_body"> </Text>{"\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026"}</Text>;
419
- $[41] = t18;
420
- } else {
421
- t18 = $[41];
422
- }
423
- let t19;
424
- if ($[42] !== t3) {
425
- t19 = <Box width={WELCOME_V2_WIDTH}><Text>{t3}{t4}{t5}{t6}{t7}{t8}{t9}{t10}{t11}{t12}{t13}{t14}{t15}{t16}{t17}{t18}</Text></Box>;
426
- $[42] = t3;
427
- $[43] = t19;
428
- } else {
429
- t19 = $[43];
430
  }
431
- return t19;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
432
  }
433
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIkJveCIsIlRleHQiLCJ1c2VUaGVtZSIsImVudiIsIldFTENPTUVfVjJfV0lEVEgiLCJXZWxjb21lVjIiLCIkIiwiX2MiLCJ0aGVtZSIsInRlcm1pbmFsIiwidDAiLCJ3ZWxjb21lTWVzc2FnZSIsImluY2x1ZGVzIiwidDEiLCJ0MiIsInQzIiwidDQiLCJ0NSIsInQ2IiwidDciLCJ0OCIsIlN5bWJvbCIsImZvciIsIk1BQ1JPIiwiVkVSU0lPTiIsInQ5IiwidDEwIiwidDExIiwidDEyIiwidDEzIiwidDE0IiwidDE1IiwidDE2IiwiQXBwbGVUZXJtaW5hbFdlbGNvbWVWMlByb3BzIiwiQXBwbGVUZXJtaW5hbFdlbGNvbWVWMiIsImlzTGlnaHRUaGVtZSIsInQxNyIsInJlcGVhdCIsInQxOCIsInQxOSJdLCJzb3VyY2VzIjpbIldlbGNvbWVWMi50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgQm94LCBUZXh0LCB1c2VUaGVtZSB9IGZyb20gJ3NyYy9pbmsuanMnXG5pbXBvcnQgeyBlbnYgfSBmcm9tICcuLi8uLi91dGlscy9lbnYuanMnXG5cbmNvbnN0IFdFTENPTUVfVjJfV0lEVEggPSA1OFxuXG5leHBvcnQgZnVuY3Rpb24gV2VsY29tZVYyKCk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGNvbnN0IFt0aGVtZV0gPSB1c2VUaGVtZSgpXG4gIGNvbnN0IHdlbGNvbWVNZXNzYWdlID0gJ1dlbGNvbWUgdG8gQ2xhdWRlIENvZGUnXG5cbiAgaWYgKGVudi50ZXJtaW5hbCA9PT0gJ0FwcGxlX1Rlcm1pbmFsJykge1xuICAgIHJldHVybiAoXG4gICAgICA8QXBwbGVUZXJtaW5hbFdlbGNvbWVWMiB0aGVtZT17dGhlbWV9IHdlbGNvbWVNZXNzYWdlPXt3ZWxjb21lTWVzc2FnZX0gLz5cbiAgICApXG4gIH1cblxuICBpZiAoWydsaWdodCcsICdsaWdodC1kYWx0b25pemVkJywgJ2xpZ2h0LWFuc2knXS5pbmNsdWRlcyh0aGVtZSkpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEJveCB3aWR0aD17V0VMQ09NRV9WMl9XSURUSH0+XG4gICAgICAgIDxUZXh0PlxuICAgICAgICAgIDxUZXh0PlxuICAgICAgICAgICAgPFRleHQgY29sb3I9XCJjbGF1ZGVcIj57d2VsY29tZU1lc3NhZ2V9IDwvVGV4dD5cbiAgICAgICAgICAgIDxUZXh0IGRpbUNvbG9yPnZ7TUFDUk8uVkVSU0lPTn0gPC9UZXh0PlxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICA8VGV4dD5cbiAgICAgICAgICAgIHsn4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCmJ31cbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgPFRleHQ+XG4gICAgICAgICAgICB7JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnfVxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICA8VGV4dD5cbiAgICAgICAgICAgIHsnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd9XG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgIDxUZXh0PlxuICAgICAgICAgICAgeycgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ31cbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgPFRleHQ+XG4gICAgICAgICAgICB7JyAgICAgICAgICAgIOKWkeKWkeKWkeKWkeKWkeKWkSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnfVxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICA8VGV4dD5cbiAgICAgICAgICAgIHsnICAgIOKWkeKWkeKWkSAgIOKWkeKWkeKWkeKWkeKWkeKWkeKWkeKWkeKWkeKWkSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ31cbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgPFRleHQ+XG4gICAgICAgICAgICB7JyAgIOKWkeKWkeKWkeKWkeKWkeKWkeKWkeKWkeKWkeKWkeKWkeKWkeKWkeKWkeKWkeKWkeKWkeKWkeKWkSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd9XG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgIDxUZXh0PlxuICAgICAgICAgICAgeycgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ31cbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgPFRleHQ+XG4gICAgICAgICAgICA8VGV4dCBkaW1Db2xvcj57JyAgICAgICAgICAgICAgICAgICAgICAgICAgIOKWkeKWkeKWkeKWkSd9PC9UZXh0PlxuICAgICAgICAgICAgPFRleHQ+eycgICAgICAgICAgICAgICAgICAgICDilojiloggICAgJ308L1RleHQ+XG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgIDxUZXh0PlxuICAgICAgICAgICAgPFRleHQgZGltQ29sb3I+eycgICAgICAgICAgICAgICAgICAgICAgICAg4paR4paR4paR4paR4paR4paR4paR4paR4paR4paRJ308L1RleHQ+XG4gICAgICAgICAgICA8VGV4dD57JyAgICAgICAgICAgICAgIOKWiOKWiOKWkuKWkuKWiOKWiCAgJ308L1RleHQ+XG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgIDxUZXh0PlxuICAgICAgICAgICAgeycgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKWkuKWkiAgICAgIOKWiOKWiCAgIOKWkid9XG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgIDxUZXh0PlxuICAgICAgICAgICAgeycgICAgICAnfVxuICAgICAgICAgICAgPFRleHQgY29sb3I9XCJjbGF3ZF9ib2R5XCI+IOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiCA8L1RleHQ+XG4gICAgICAgICAgICB7JyAgICAgICAgICAgICAgICAgICAgICAgICDilpLilpLilpHilpHilpLilpIgICAgICDilpIg4paS4paSJ31cbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgPFRleHQ+XG4gICAgICAgICAgICB7JyAgICAgICd9XG4gICAgICAgICAgICA8VGV4dCBjb2xvcj1cImNsYXdkX2JvZHlcIiBiYWNrZ3JvdW5kQ29sb3I9XCJjbGF3ZF9iYWNrZ3JvdW5kXCI+XG4gICAgICAgICAgICAgIOKWiOKWiOKWhOKWiOKWiOKWiOKWiOKWiOKWhOKWiOKWiFxuICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgeycgICAgICAgICAgICAgICAgICAgICAgICAgICDilpLilpIgICAgICAgICDilpLilpIgJ31cbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgPFRleHQ+XG4gICAgICAgICAgICB7JyAgICAgICd9XG4gICAgICAgICAgICA8VGV4dCBjb2xvcj1cImNsYXdkX2JvZHlcIj4g4paI4paI4paI4paI4paI4paI4paI4paI4paIIDwvVGV4dD5cbiAgICAgICAgICAgIHsnICAgICAgICAgICAgICAgICAgICAgICAgICDilpEgICAgICAgICAg4paSICAgJ31cbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgPFRleHQ+XG4gICAgICAgICAgICB7J+KApuKApuKApuKApuKApuKApuKApid9XG4gICAgICAgICAgICA8VGV4dCBjb2xvcj1cImNsYXdkX2JvZHlcIj57J+KWiCDiloggICDilogg4paIJ308L1RleHQ+XG4gICAgICAgICAgICB7J+KApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKWkeKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKWkuKApuKApuKApuKApid9XG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICA8L1RleHQ+XG4gICAgICA8L0JveD5cbiAgICApXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxCb3ggd2lkdGg9e1dFTENPTUVfVjJfV0lEVEh9PlxuICAgICAgPFRleHQ+XG4gICAgICAgIDxUZXh0PlxuICAgICAgICAgIDxUZXh0IGNvbG9yPVwiY2xhdWRlXCI+e3dlbGNvbWVNZXNzYWdlfSA8L1RleHQ+XG4gICAgICAgICAgPFRleHQgZGltQ29sb3I+dntNQUNSTy5WRVJTSU9OfSA8L1RleHQ+XG4gICAgICAgIDwvVGV4dD5cbiAgICAgICAgPFRleHQ+XG4gICAgICAgICAgeyfigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKYnfVxuICAgICAgICA8L1RleHQ+XG4gICAgICAgIDxUZXh0PlxuICAgICAgICAgIHsnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd9XG4gICAgICAgIDwvVGV4dD5cbiAgICAgICAgPFRleHQ+XG4gICAgICAgICAgeycgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilojilojilojilojilojilpPilpPilpEgICAgICd9XG4gICAgICAgIDwvVGV4dD5cbiAgICAgICAgPFRleHQ+XG4gICAgICAgICAgeycgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAg4paI4paI4paI4paT4paRICAgICDilpHilpEgICAnfVxuICAgICAgICA8L1RleHQ+XG4gICAgICAgIDxUZXh0PlxuICAgICAgICAgIHsnICAgICAgICAgICAg4paR4paR4paR4paR4paR4paRICAgICAgICAgICAgICAgICAgICAgICAg4paI4paI4paI4paT4paRICAgICAgICAgICAnfVxuICAgICAgICA8L1RleHQ+XG4gICAgICAgIDxUZXh0PlxuICAgICAgICAgIHsnICAgIOKWkeKWkeKWkSAgIOKWkeKWkeKWkeKWkeKWkeKWkeKWkeKWkeKWkeKWkSAgICAgICAgICAgICAgICAgICAgICDilojilojilojilpPilpEgICAgICAgICAgICd9XG4gICAgICAgIDwvVGV4dD5cbiAgICAgICAgPFRleHQ+XG4gICAgICAgICAgPFRleHQ+eycgICDilpHilpHilpHilpHilpHilpHilpHilpHilpHilpHilpHilpHilpHilpHilpHilpHilpHilpHilpEgICAgJ308L1RleHQ+XG4gICAgICAgICAgPFRleHQgYm9sZD4qPC9UZXh0PlxuICAgICAgICAgIDxUZXh0PnsnICAgICAgICAgICAgICAgIOKWiOKWiOKWk+KWkeKWkSAgICAgIOKWkyAgICd9PC9UZXh0PlxuICAgICAgICA8L1RleHQ+XG4gICAgICAgIDxUZXh0PlxuICAgICAgICAgIHsnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4paR4paT4paT4paI4paI4paI4paT4paT4paRICAgICd9XG4gICAgICAgIDwvVGV4dD5cbiAgICAgICAgPFRleHQgZGltQ29sb3I+XG4gICAgICAgICAgeycgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKWkeKWkeKWkeKWkSAgICAgICAgICAgICAgICAgICAnfVxuICAgICAgICA8L1RleHQ+XG4gICAgICAgIDxUZXh0IGRpbUNvbG9yPlxuICAgICAgICAgIHsnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4paR4paR4paR4paR4paR4paR4paR4paRICAgICAgICAgICAgICAgICAnfVxuICAgICAgICA8L1RleHQ+XG4gICAgICAgIDxUZXh0IGRpbUNvbG9yPlxuICAgICAgICAgIHsnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKWkeKWkeKWkeKWkeKWkeKWkeKWkeKWkeKWkeKWkeKWkeKWkeKWkeKWkeKWkeKWkSAgICAgICAgICAgJ31cbiAgICAgICAgPC9UZXh0PlxuICAgICAgICA8VGV4dD5cbiAgICAgICAgICB7JyAgICAgICd9XG4gICAgICAgICAgPFRleHQgY29sb3I9XCJjbGF3ZF9ib2R5XCI+IOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiCA8L1RleHQ+XG4gICAgICAgICAgeycgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnfVxuICAgICAgICAgIDxUZXh0IGRpbUNvbG9yPio8L1RleHQ+XG4gICAgICAgICAgPFRleHQ+IDwvVGV4dD5cbiAgICAgICAgPC9UZXh0PlxuICAgICAgICA8VGV4dD5cbiAgICAgICAgICB7JyAgICAgICd9XG4gICAgICAgICAgPFRleHQgY29sb3I9XCJjbGF3ZF9ib2R5XCI+4paI4paI4paE4paI4paI4paI4paI4paI4paE4paI4paIPC9UZXh0PlxuICAgICAgICAgIDxUZXh0PnsnICAgICAgICAgICAgICAgICAgICAgICAgJ308L1RleHQ+XG4gICAgICAgICAgPFRleHQgYm9sZD4qPC9UZXh0PlxuICAgICAgICAgIDxUZXh0PnsnICAgICAgICAgICAgICAgICd9PC9UZXh0PlxuICAgICAgICA8L1RleHQ+XG4gICAgICAgIDxUZXh0PlxuICAgICAgICAgIHsnICAgICAgJ31cbiAgICAgICAgICA8VGV4dCBjb2xvcj1cImNsYXdkX2JvZHlcIj4g4paI4paI4paI4paI4paI4paI4paI4paI4paIIDwvVGV4dD5cbiAgICAgICAgICB7JyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ31cbiAgICAgICAgPC9UZXh0PlxuICAgICAgICA8VGV4dD5cbiAgICAgICAgICB7J+KApuKApuKApuKApuKApuKApuKApid9XG4gICAgICAgICAgPFRleHQgY29sb3I9XCJjbGF3ZF9ib2R5XCI+eyfilogg4paIICAg4paIIOKWiCd9PC9UZXh0PlxuICAgICAgICAgIHsn4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCmJ31cbiAgICAgICAgPC9UZXh0PlxuICAgICAgPC9UZXh0PlxuICAgIDwvQm94PlxuICApXG59XG5cbnR5cGUgQXBwbGVUZXJtaW5hbFdlbGNvbWVWMlByb3BzID0ge1xuICB0aGVtZTogc3RyaW5nXG4gIHdlbGNvbWVNZXNzYWdlOiBzdHJpbmdcbn1cblxuZnVuY3Rpb24gQXBwbGVUZXJtaW5hbFdlbGNvbWVWMih7XG4gIHRoZW1lLFxuICB3ZWxjb21lTWVzc2FnZSxcbn06IEFwcGxlVGVybWluYWxXZWxjb21lVjJQcm9wcyk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGNvbnN0IGlzTGlnaHRUaGVtZSA9IFsnbGlnaHQnLCAnbGlnaHQtZGFsdG9uaXplZCcsICdsaWdodC1hbnNpJ10uaW5jbHVkZXMoXG4gICAgdGhlbWUsXG4gIClcblxuICBpZiAoaXNMaWdodFRoZW1lKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxCb3ggd2lkdGg9e1dFTENPTUVfVjJfV0lEVEh9PlxuICAgICAgICA8VGV4dD5cbiAgICAgICAgICA8VGV4dD5cbiAgICAgICAgICAgIDxUZXh0IGNvbG9yPVwiY2xhdWRlXCI+e3dlbGNvbWVNZXNzYWdlfSA8L1RleHQ+XG4gICAgICAgICAgICA8VGV4dCBkaW1Db2xvcj52e01BQ1JPLlZFUlNJT059IDwvVGV4dD5cbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgPFRleHQ+XG4gICAgICAgICAgICB7J+KApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApid9XG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgIDxUZXh0PlxuICAgICAgICAgICAgeycgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ31cbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgPFRleHQ+XG4gICAgICAgICAgICB7JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnfVxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICA8VGV4dD5cbiAgICAgICAgICAgIHsnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd9XG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgIDxUZXh0PlxuICAgICAgICAgICAgeycgICAgICAgICAgICDilpHilpHilpHilpHilpHilpEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ31cbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgPFRleHQ+XG4gICAgICAgICAgICB7JyAgICDilpHilpHilpEgICDilpHilpHilpHilpHilpHilpHilpHilpHilpHilpEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd9XG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgIDxUZXh0PlxuICAgICAgICAgICAgeycgICDilpHilpHilpHilpHilpHilpHilpHilpHilpHilpHilpHilpHilpHilpHilpHilpHilpHilpHilpEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnfVxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICA8VGV4dD5cbiAgICAgICAgICAgIHsnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd9XG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgIDxUZXh0PlxuICAgICAgICAgICAgPFRleHQgZGltQ29sb3I+eycgICAgICAgICAgICAgICAgICAgICAgICAgICDilpHilpHilpHilpEnfTwvVGV4dD5cbiAgICAgICAgICAgIDxUZXh0PnsnICAgICAgICAgICAgICAgICAgICAg4paI4paIICAgICd9PC9UZXh0PlxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICA8VGV4dD5cbiAgICAgICAgICAgIDxUZXh0IGRpbUNvbG9yPnsnICAgICAgICAgICAgICAgICAgICAgICAgIOKWkeKWkeKWkeKWkeKWkeKWkeKWkeKWkeKWkeKWkSd9PC9UZXh0PlxuICAgICAgICAgICAgPFRleHQ+eycgICAgICAgICAgICAgICDilojilojilpLilpLilojiloggICd9PC9UZXh0PlxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICA8VGV4dD5cbiAgICAgICAgICAgIHsnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilpLilpIgICAgICDilojiloggICDilpInfVxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICA8VGV4dD5cbiAgICAgICAgICAgIHsnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4paS4paS4paR4paR4paS4paSICAgICAg4paSIOKWkuKWkid9XG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgIDxUZXh0PlxuICAgICAgICAgICAgeycgICAgICAnfVxuICAgICAgICAgICAgPFRleHQgY29sb3I9XCJjbGF3ZF9ib2R5XCI+4paXPC9UZXh0PlxuICAgICAgICAgICAgPFRleHQgY29sb3I9XCJjbGF3ZF9iYWNrZ3JvdW5kXCIgYmFja2dyb3VuZENvbG9yPVwiY2xhd2RfYm9keVwiPlxuICAgICAgICAgICAgICB7JyAnfVxuICAgICAgICAgICAgICDilpd7JyAgICAgJ33ilpZ7JyAnfVxuICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgPFRleHQgY29sb3I9XCJjbGF3ZF9ib2R5XCI+4paWPC9UZXh0PlxuICAgICAgICAgICAgeycgICAgICAgICAgICAgICAgICAgICAgICAgICDilpLilpIgICAgICAgICDilpLilpIgJ31cbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgPFRleHQ+XG4gICAgICAgICAgICB7JyAgICAgICAnfVxuICAgICAgICAgICAgPFRleHQgYmFja2dyb3VuZENvbG9yPVwiY2xhd2RfYm9keVwiPnsnICcucmVwZWF0KDkpfTwvVGV4dD5cbiAgICAgICAgICAgIHsnICAgICAgICAgICAgICAgICAgICAgICAgICAg4paRICAgICAgICAgIOKWkiAgICd9XG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgIDxUZXh0PlxuICAgICAgICAgICAgeyfigKbigKbigKbigKbigKbigKbigKYnfVxuICAgICAgICAgICAgPFRleHQgYmFja2dyb3VuZENvbG9yPVwiY2xhd2RfYm9keVwiPiA8L1RleHQ+XG4gICAgICAgICAgICA8VGV4dD4gPC9UZXh0PlxuICAgICAgICAgICAgPFRleHQgYmFja2dyb3VuZENvbG9yPVwiY2xhd2RfYm9keVwiPiA8L1RleHQ+XG4gICAgICAgICAgICA8VGV4dD57JyAgICd9PC9UZXh0PlxuICAgICAgICAgICAgPFRleHQgYmFja2dyb3VuZENvbG9yPVwiY2xhd2RfYm9keVwiPiA8L1RleHQ+XG4gICAgICAgICAgICA8VGV4dD4gPC9UZXh0PlxuICAgICAgICAgICAgPFRleHQgYmFja2dyb3VuZENvbG9yPVwiY2xhd2RfYm9keVwiPiA8L1RleHQ+XG4gICAgICAgICAgICB7J+KApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKWkeKApuKApuKApuKApuKApuKApuKApuKApuKApuKApuKWkuKApuKApuKApuKApid9XG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICA8L1RleHQ+XG4gICAgICA8L0JveD5cbiAgICApXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxCb3ggd2lkdGg9e1dFTENPTUVfVjJfV0lEVEh9PlxuICAgICAgPFRleHQ+XG4gICAgICAgIDxUZXh0PlxuICAgICAgICAgIDxUZXh0IGNvbG9yPVwiY2xhdWRlXCI+e3dlbGNvbWVNZXNzYWdlfSA8L1RleHQ+XG4gICAgICAgICAgPFRleHQgZGltQ29sb3I+dntNQUNSTy5WRVJTSU9OfSA8L1RleHQ+XG4gICAgICAgIDwvVGV4dD5cbiAgICAgICAgPFRleHQ+XG4gICAgICAgICAgeyfigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKbigKYnfVxuICAgICAgICA8L1RleHQ+XG4gICAgICAgIDxUZXh0PlxuICAgICAgICAgIHsnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd9XG4gICAgICAgIDwvVGV4dD5cbiAgICAgICAgPFRleHQ+XG4gICAgICAgICAgeycgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilojilojilojilojilojilpPilpPilpEgICAgICd9XG4gICAgICAgIDwvVGV4dD5cbiAgICAgICAgPFRleHQ+XG4gICAgICAgICAgeycgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAg4paI4paI4paI4paT4paRICAgICDilpHilpEgICAnfVxuICAgICAgICA8L1RleHQ+XG4gICAgICAgIDxUZXh0PlxuICAgICAgICAgIHsnICAgICAgICAgICAg4paR4paR4paR4paR4paR4paRICAgICAgICAgICAgICAgICAgICAgICAg4paI4paI4paI4paT4paRICAgICAgICAgICAnfVxuICAgICAgICA8L1RleHQ+XG4gICAgICAgIDxUZXh0PlxuICAgICAgICAgIHsnICAgIOKWkeKWkeKWkSAgIOKWkeKWkeKWkeKWkeKWkeKWkeKWkeKWkeKWkeKWkSAgICAgICAgICAgICAgICAgICAgICDilojilojilojilpPilpEgICAgICAgICAgICd9XG4gICAgICAgIDwvVGV4dD5cbiAgICAgICAgPFRleHQ+XG4gICAgICAgICAgPFRleHQ+eycgICDilpHilpHilpHilpHilpHilpHilpHilpHilpHilpHilpHilpHilpHilpHilpHilpHilpHilpHilpEgICAgJ308L1RleHQ+XG4gICAgICAgICAgPFRleHQgYm9sZD4qPC9UZXh0PlxuICAgICAgICAgIDxUZXh0PnsnICAgICAgICAgICAgICAgIOKWiOKWiOKWk+KWkeKWkSAgICAgIOKWkyAgICd9PC9UZXh0PlxuICAgICAgICA8L1RleHQ+XG4gICAgICAgIDxUZXh0PlxuICAgICAgICAgIHsnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4paR4paT4paT4paI4paI4paI4paT4paT4paRICAgICd9XG4gICAgICAgIDwvVGV4dD5cbiAgICAgICAgPFRleHQgZGltQ29sb3I+XG4gICAgICAgICAgeycgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKWkeKWkeKWkeKWkSAgICAgICAgICAgICAgICAgICAnfVxuICAgICAgICA8L1RleHQ+XG4gICAgICAgIDxUZXh0IGRpbUNvbG9yPlxuICAgICAgICAgIHsnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4paR4paR4paR4paR4paR4paR4paR4paRICAgICAgICAgICAgICAgICAnfVxuICAgICAgICA8L1RleHQ+XG4gICAgICAgIDxUZXh0IGRpbUNvbG9yPlxuICAgICAgICAgIHsnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKWkeKWkeKWkeKWkeKWkeKWkeKWkeKWkeKWkeKWkeKWkeKWkeKWkeKWkeKWkeKWkSAgICAgICAgICAgJ31cbiAgICAgICAgPC9UZXh0PlxuICAgICAgICA8VGV4dD5cbiAgICAgICAgICB7JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd9XG4gICAgICAgICAgPFRleHQgZGltQ29sb3I+KjwvVGV4dD5cbiAgICAgICAgICA8VGV4dD4gPC9UZXh0PlxuICAgICAgICA8L1RleHQ+XG4gICAgICAgIDxUZXh0PlxuICAgICAgICAgIHsnICAgICAgICAnfVxuICAgICAgICAgIDxUZXh0IGNvbG9yPVwiY2xhd2RfYm9keVwiPuKWlzwvVGV4dD5cbiAgICAgICAgICA8VGV4dCBjb2xvcj1cImNsYXdkX2JhY2tncm91bmRcIiBiYWNrZ3JvdW5kQ29sb3I9XCJjbGF3ZF9ib2R5XCI+XG4gICAgICAgICAgICB7JyAnfVxuICAgICAgICAgICAg4paXeycgICAgICd94paWeycgJ31cbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgPFRleHQgY29sb3I9XCJjbGF3ZF9ib2R5XCI+4paWPC9UZXh0PlxuICAgICAgICAgIDxUZXh0PnsnICAgICAgICAgICAgICAgICAgICAgICAnfTwvVGV4dD5cbiAgICAgICAgICA8VGV4dCBib2xkPio8L1RleHQ+XG4gICAgICAgICAgPFRleHQ+eycgICAgICAgICAgICAgICAgJ308L1RleHQ+XG4gICAgICAgIDwvVGV4dD5cbiAgICAgICAgPFRleHQ+XG4gICAgICAgICAgeycgICAgICAgICd9XG4gICAgICAgICAgPFRleHQgYmFja2dyb3VuZENvbG9yPVwiY2xhd2RfYm9keVwiPnsnICcucmVwZWF0KDkpfTwvVGV4dD5cbiAgICAgICAgICB7JyAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd9XG4gICAgICAgIDwvVGV4dD5cbiAgICAgICAgPFRleHQ+XG4gICAgICAgICAgeyfigKbigKbigKbigKbigKbigKbigKYnfVxuICAgICAgICAgIDxUZXh0IGJhY2tncm91bmRDb2xvcj1cImNsYXdkX2JvZHlcIj4gPC9UZXh0PlxuICAgICAgICAgIDxUZXh0PiA8L1RleHQ+XG4gICAgICAgICAgPFRleHQgYmFja2dyb3VuZENvbG9yPVwiY2xhd2RfYm9keVwiPiA8L1RleHQ+XG4gICAgICAgICAgPFRleHQ+eycgICAnfTwvVGV4dD5cbiAgICAgICAgICA8VGV4dCBiYWNrZ3JvdW5kQ29sb3I9XCJjbGF3ZF9ib2R5XCI+IDwvVGV4dD5cbiAgICAgICAgICA8VGV4dD4gPC9UZXh0PlxuICAgICAgICAgIDxUZXh0IGJhY2tncm91bmRDb2xvcj1cImNsYXdkX2JvZHlcIj4gPC9UZXh0PlxuICAgICAgICAgIHsn4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCm4oCmJ31cbiAgICAgICAgPC9UZXh0PlxuICAgICAgPC9UZXh0PlxuICAgIDwvQm94PlxuICApXG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPQSxLQUFLLE1BQU0sT0FBTztBQUN6QixTQUFTQyxHQUFHLEVBQUVDLElBQUksRUFBRUMsUUFBUSxRQUFRLFlBQVk7QUFDaEQsU0FBU0MsR0FBRyxRQUFRLG9CQUFvQjtBQUV4QyxNQUFNQyxnQkFBZ0IsR0FBRyxFQUFFO0FBRTNCLE9BQU8sU0FBQUMsVUFBQTtFQUFBLE1BQUFDLENBQUEsR0FBQUMsRUFBQTtFQUNMLE9BQUFDLEtBQUEsSUFBZ0JOLFFBQVEsQ0FBQyxDQUFDO0VBRzFCLElBQUlDLEdBQUcsQ0FBQU0sUUFBUyxLQUFLLGdCQUFnQjtJQUFBLElBQUFDLEVBQUE7SUFBQSxJQUFBSixDQUFBLFFBQUFFLEtBQUE7TUFFakNF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
 
1
+ import React from 'react'
2
+ import { Box, Text, useTheme } from 'src/ink.js'
3
+ import { env } from '../../utils/env.js'
4
+
5
+ const WELCOME_V2_WIDTH = 58
6
+
7
+ export function WelcomeV2(): React.ReactNode {
8
+ const [theme] = useTheme()
9
+ const welcomeMessage = 'Welcome to Claude Code'
10
+
11
+ if (env.terminal === 'Apple_Terminal') {
12
+ return (
13
+ <AppleTerminalWelcomeV2 theme={theme} welcomeMessage={welcomeMessage} />
14
+ )
 
 
 
 
15
  }
16
+
17
+ if (['light', 'light-daltonized', 'light-ansi'].includes(theme)) {
18
+ return (
19
+ <Box width={WELCOME_V2_WIDTH}>
20
+ <Text>
21
+ <Text>
22
+ <Text color="claude">{welcomeMessage} </Text>
23
+ <Text dimColor>v{MACRO.VERSION} </Text>
24
+ </Text>
25
+ <Text>
26
+ {'…………………………………………………………………………………………………………………………………………………………'}
27
+ </Text>
28
+ <Text>
29
+ {' '}
30
+ </Text>
31
+ <Text>
32
+ {' '}
33
+ </Text>
34
+ <Text>
35
+ {' '}
36
+ </Text>
37
+ <Text>
38
+ {' β–‘β–‘β–‘β–‘β–‘β–‘ '}
39
+ </Text>
40
+ <Text>
41
+ {' β–‘β–‘β–‘ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘ '}
42
+ </Text>
43
+ <Text>
44
+ {' β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘ '}
45
+ </Text>
46
+ <Text>
47
+ {' '}
48
+ </Text>
49
+ <Text>
50
+ <Text dimColor>{' β–‘β–‘β–‘β–‘'}</Text>
51
+ <Text>{' β–ˆβ–ˆ '}</Text>
52
+ </Text>
53
+ <Text>
54
+ <Text dimColor>{' β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘'}</Text>
55
+ <Text>{' β–ˆβ–ˆβ–’β–’β–ˆβ–ˆ '}</Text>
56
+ </Text>
57
+ <Text>
58
+ {' β–’β–’ β–ˆβ–ˆ β–’'}
59
+ </Text>
60
+ <Text>
61
+ {' '}
62
+ <Text color="clawd_body"> β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ </Text>
63
+ {' β–’β–’β–‘β–‘β–’β–’ β–’ β–’β–’'}
64
+ </Text>
65
+ <Text>
66
+ {' '}
67
+ <Text color="clawd_body" backgroundColor="clawd_background">
68
+ β–ˆβ–ˆβ–„β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–„β–ˆβ–ˆ
69
+ </Text>
70
+ {' β–’β–’ β–’β–’ '}
71
+ </Text>
72
+ <Text>
73
+ {' '}
74
+ <Text color="clawd_body"> β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ </Text>
75
+ {' β–‘ β–’ '}
76
+ </Text>
77
+ <Text>
78
+ {'…………………'}
79
+ <Text color="clawd_body">{'β–ˆ β–ˆ β–ˆ β–ˆ'}</Text>
80
+ {'……………………………………………………………………░…………………………▒…………'}
81
+ </Text>
82
+ </Text>
83
+ </Box>
84
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
85
  }
86
+
87
+ return (
88
+ <Box width={WELCOME_V2_WIDTH}>
89
+ <Text>
90
+ <Text>
91
+ <Text color="claude">{welcomeMessage} </Text>
92
+ <Text dimColor>v{MACRO.VERSION} </Text>
93
+ </Text>
94
+ <Text>
95
+ {'…………………………………………………………………………………………………………………………………………………………'}
96
+ </Text>
97
+ <Text>
98
+ {' '}
99
+ </Text>
100
+ <Text>
101
+ {' * β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–“β–“β–‘ '}
102
+ </Text>
103
+ <Text>
104
+ {' * β–ˆβ–ˆβ–ˆβ–“β–‘ β–‘β–‘ '}
105
+ </Text>
106
+ <Text>
107
+ {' β–‘β–‘β–‘β–‘β–‘β–‘ β–ˆβ–ˆβ–ˆβ–“β–‘ '}
108
+ </Text>
109
+ <Text>
110
+ {' β–‘β–‘β–‘ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘ β–ˆβ–ˆβ–ˆβ–“β–‘ '}
111
+ </Text>
112
+ <Text>
113
+ <Text>{' β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘ '}</Text>
114
+ <Text bold>*</Text>
115
+ <Text>{' β–ˆβ–ˆβ–“β–‘β–‘ β–“ '}</Text>
116
+ </Text>
117
+ <Text>
118
+ {' β–‘β–“β–“β–ˆβ–ˆβ–ˆβ–“β–“β–‘ '}
119
+ </Text>
120
+ <Text dimColor>
121
+ {' * β–‘β–‘β–‘β–‘ '}
122
+ </Text>
123
+ <Text dimColor>
124
+ {' β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘ '}
125
+ </Text>
126
+ <Text dimColor>
127
+ {' β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘ '}
128
+ </Text>
129
+ <Text>
130
+ {' '}
131
+ <Text color="clawd_body"> β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ </Text>
132
+ {' '}
133
+ <Text dimColor>*</Text>
134
+ <Text> </Text>
135
+ </Text>
136
+ <Text>
137
+ {' '}
138
+ <Text color="clawd_body">β–ˆβ–ˆβ–„β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–„β–ˆβ–ˆ</Text>
139
+ <Text>{' '}</Text>
140
+ <Text bold>*</Text>
141
+ <Text>{' '}</Text>
142
+ </Text>
143
+ <Text>
144
+ {' '}
145
+ <Text color="clawd_body"> β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ </Text>
146
+ {' * '}
147
+ </Text>
148
+ <Text>
149
+ {'…………………'}
150
+ <Text color="clawd_body">{'β–ˆ β–ˆ β–ˆ β–ˆ'}</Text>
151
+ {'………………………………………………………………………………………………………………'}
152
+ </Text>
153
+ </Text>
154
+ </Box>
155
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
156
  }
157
+
158
  type AppleTerminalWelcomeV2Props = {
159
+ theme: string
160
+ welcomeMessage: string
161
+ }
162
+
163
+ function AppleTerminalWelcomeV2({
164
+ theme,
165
+ welcomeMessage,
166
+ }: AppleTerminalWelcomeV2Props): React.ReactNode {
167
+ const isLightTheme = ['light', 'light-daltonized', 'light-ansi'].includes(
168
  theme,
169
+ )
170
+
 
171
  if (isLightTheme) {
172
+ return (
173
+ <Box width={WELCOME_V2_WIDTH}>
174
+ <Text>
175
+ <Text>
176
+ <Text color="claude">{welcomeMessage} </Text>
177
+ <Text dimColor>v{MACRO.VERSION} </Text>
178
+ </Text>
179
+ <Text>
180
+ {'…………………………………………………………………………………………………………………………………………………………'}
181
+ </Text>
182
+ <Text>
183
+ {' '}
184
+ </Text>
185
+ <Text>
186
+ {' '}
187
+ </Text>
188
+ <Text>
189
+ {' '}
190
+ </Text>
191
+ <Text>
192
+ {' β–‘β–‘β–‘β–‘β–‘β–‘ '}
193
+ </Text>
194
+ <Text>
195
+ {' β–‘β–‘β–‘ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘ '}
196
+ </Text>
197
+ <Text>
198
+ {' β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘ '}
199
+ </Text>
200
+ <Text>
201
+ {' '}
202
+ </Text>
203
+ <Text>
204
+ <Text dimColor>{' β–‘β–‘β–‘β–‘'}</Text>
205
+ <Text>{' β–ˆβ–ˆ '}</Text>
206
+ </Text>
207
+ <Text>
208
+ <Text dimColor>{' β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘'}</Text>
209
+ <Text>{' β–ˆβ–ˆβ–’β–’β–ˆβ–ˆ '}</Text>
210
+ </Text>
211
+ <Text>
212
+ {' β–’β–’ β–ˆβ–ˆ β–’'}
213
+ </Text>
214
+ <Text>
215
+ {' β–’β–’β–‘β–‘β–’β–’ β–’ β–’β–’'}
216
+ </Text>
217
+ <Text>
218
+ {' '}
219
+ <Text color="clawd_body">β–—</Text>
220
+ <Text color="clawd_background" backgroundColor="clawd_body">
221
+ {' '}
222
+ β–—{' '}β––{' '}
223
+ </Text>
224
+ <Text color="clawd_body">β––</Text>
225
+ {' β–’β–’ β–’β–’ '}
226
+ </Text>
227
+ <Text>
228
+ {' '}
229
+ <Text backgroundColor="clawd_body">{' '.repeat(9)}</Text>
230
+ {' β–‘ β–’ '}
231
+ </Text>
232
+ <Text>
233
+ {'…………………'}
234
+ <Text backgroundColor="clawd_body"> </Text>
235
+ <Text> </Text>
236
+ <Text backgroundColor="clawd_body"> </Text>
237
+ <Text>{' '}</Text>
238
+ <Text backgroundColor="clawd_body"> </Text>
239
+ <Text> </Text>
240
+ <Text backgroundColor="clawd_body"> </Text>
241
+ {'……………………………………………………………………░…………………………▒…………'}
242
+ </Text>
243
+ </Text>
244
+ </Box>
245
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
246
  }
247
+
248
+ return (
249
+ <Box width={WELCOME_V2_WIDTH}>
250
+ <Text>
251
+ <Text>
252
+ <Text color="claude">{welcomeMessage} </Text>
253
+ <Text dimColor>v{MACRO.VERSION} </Text>
254
+ </Text>
255
+ <Text>
256
+ {'…………………………………………………………………………………………………………………………………………………………'}
257
+ </Text>
258
+ <Text>
259
+ {' '}
260
+ </Text>
261
+ <Text>
262
+ {' * β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–“β–“β–‘ '}
263
+ </Text>
264
+ <Text>
265
+ {' * β–ˆβ–ˆβ–ˆβ–“β–‘ β–‘β–‘ '}
266
+ </Text>
267
+ <Text>
268
+ {' β–‘β–‘β–‘β–‘β–‘β–‘ β–ˆβ–ˆβ–ˆβ–“β–‘ '}
269
+ </Text>
270
+ <Text>
271
+ {' β–‘β–‘β–‘ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘ β–ˆβ–ˆβ–ˆβ–“β–‘ '}
272
+ </Text>
273
+ <Text>
274
+ <Text>{' β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘ '}</Text>
275
+ <Text bold>*</Text>
276
+ <Text>{' β–ˆβ–ˆβ–“β–‘β–‘ β–“ '}</Text>
277
+ </Text>
278
+ <Text>
279
+ {' β–‘β–“β–“β–ˆβ–ˆβ–ˆβ–“β–“β–‘ '}
280
+ </Text>
281
+ <Text dimColor>
282
+ {' * β–‘β–‘β–‘β–‘ '}
283
+ </Text>
284
+ <Text dimColor>
285
+ {' β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘ '}
286
+ </Text>
287
+ <Text dimColor>
288
+ {' β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘οΏ½οΏ½οΏ½β–‘β–‘β–‘β–‘β–‘ '}
289
+ </Text>
290
+ <Text>
291
+ {' '}
292
+ <Text dimColor>*</Text>
293
+ <Text> </Text>
294
+ </Text>
295
+ <Text>
296
+ {' '}
297
+ <Text color="clawd_body">β–—</Text>
298
+ <Text color="clawd_background" backgroundColor="clawd_body">
299
+ {' '}
300
+ β–—{' '}β––{' '}
301
+ </Text>
302
+ <Text color="clawd_body">β––</Text>
303
+ <Text>{' '}</Text>
304
+ <Text bold>*</Text>
305
+ <Text>{' '}</Text>
306
+ </Text>
307
+ <Text>
308
+ {' '}
309
+ <Text backgroundColor="clawd_body">{' '.repeat(9)}</Text>
310
+ {' * '}
311
+ </Text>
312
+ <Text>
313
+ {'…………………'}
314
+ <Text backgroundColor="clawd_body"> </Text>
315
+ <Text> </Text>
316
+ <Text backgroundColor="clawd_body"> </Text>
317
+ <Text>{' '}</Text>
318
+ <Text backgroundColor="clawd_body"> </Text>
319
+ <Text> </Text>
320
+ <Text backgroundColor="clawd_body"> </Text>
321
+ {'………………………………………………………………………………………………………………'}
322
+ </Text>
323
+ </Text>
324
+ </Box>
325
+ )
326
  }