chore: use pre-compiler code
Browse files- src/components/LogoV2/AnimatedClawd.tsx +64 -92
- src/components/LogoV2/ChannelsNotice.tsx +158 -216
- src/components/LogoV2/Clawd.tsx +69 -211
- src/components/LogoV2/CondensedLogo.tsx +117 -159
- src/components/LogoV2/Feed.tsx +99 -98
- src/components/LogoV2/FeedColumn.tsx +29 -56
- src/components/LogoV2/GuestPassesUpsell.tsx +51 -48
- src/components/LogoV2/LogoV2.tsx +472 -570
- src/components/LogoV2/Opus1mMergeNotice.tsx +38 -52
- src/components/LogoV2/OverageCreditUpsell.tsx +87 -107
- src/components/LogoV2/VoiceModeNotice.tsx +49 -66
- src/components/LogoV2/WelcomeV2.tsx +318 -425
src/components/LogoV2/AnimatedClawd.tsx
CHANGED
|
@@ -1,22 +1,14 @@
|
|
| 1 |
-
import
|
| 2 |
-
import
|
| 3 |
-
import {
|
| 4 |
-
import {
|
| 5 |
-
import {
|
| 6 |
-
|
| 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[] = [
|
| 29 |
-
// crouch
|
| 30 |
-
...hold('arms-up', 0, 3),
|
| 31 |
-
|
| 32 |
-
...hold('default',
|
| 33 |
-
//
|
| 34 |
-
...hold('
|
| 35 |
-
|
| 36 |
-
...hold('default', 0, 1)];
|
| 37 |
|
| 38 |
// Click animation: glance right, then left, then back.
|
| 39 |
-
const LOOK_AROUND: readonly Frame[] = [
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
const
|
| 46 |
-
|
| 47 |
-
const
|
|
|
|
|
|
|
|
|
|
| 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
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
|
| 63 |
-
|
| 64 |
-
|
| 65 |
-
|
| 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(
|
| 100 |
-
|
| 101 |
-
|
|
|
|
|
|
|
|
|
|
| 102 |
const onClick = () => {
|
| 103 |
-
if (reducedMotion || frameIndex !== -1) return
|
| 104 |
-
sequenceRef.current =
|
| 105 |
-
|
| 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 |
-
|
| 117 |
-
const
|
| 118 |
-
|
| 119 |
-
|
| 120 |
-
|
| 121 |
-
onClick
|
| 122 |
-
};
|
| 123 |
}
|
| 124 |
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZUVmZmVjdCIsInVzZVJlZiIsInVzZVN0YXRlIiwiQm94IiwiZ2V0SW5pdGlhbFNldHRpbmdzIiwiQ2xhd2QiLCJDbGF3ZFBvc2UiLCJGcmFtZSIsInBvc2UiLCJvZmZzZXQiLCJob2xkIiwiZnJhbWVzIiwiQXJyYXkiLCJmcm9tIiwibGVuZ3RoIiwiSlVNUF9XQVZFIiwiTE9PS19BUk9VTkQiLCJDTElDS19BTklNQVRJT05TIiwiSURMRSIsIkZSQU1FX01TIiwiaW5jcmVtZW50RnJhbWUiLCJpIiwiQ0xBV0RfSEVJR0hUIiwiQW5pbWF0ZWRDbGF3ZCIsIiQiLCJfYyIsImJvdW5jZU9mZnNldCIsIm9uQ2xpY2siLCJ1c2VDbGF3ZEFuaW1hdGlvbiIsInQwIiwidDEiLCJ0MiIsInJlZHVjZWRNb3Rpb24iLCJwcmVmZXJzUmVkdWNlZE1vdGlvbiIsImZyYW1lSW5kZXgiLCJzZXRGcmFtZUluZGV4Iiwic2VxdWVuY2VSZWYiLCJjdXJyZW50IiwiTWF0aCIsImZsb29yIiwicmFuZG9tIiwidGltZXIiLCJzZXRUaW1lb3V0IiwiY2xlYXJUaW1lb3V0Iiwic2VxIl0sInNvdXJjZXMiOlsiQW5pbWF0ZWRDbGF3ZC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IEJveCB9IGZyb20gJy4uLy4uL2luay5qcydcbmltcG9ydCB7IGdldEluaXRpYWxTZXR0aW5ncyB9IGZyb20gJy4uLy4uL3V0aWxzL3NldHRpbmdzL3NldHRpbmdzLmpzJ1xuaW1wb3J0IHsgQ2xhd2QsIHR5cGUgQ2xhd2RQb3NlIH0gZnJvbSAnLi9DbGF3ZC5qcydcblxudHlwZSBGcmFtZSA9IHsgcG9zZTogQ2xhd2RQb3NlOyBvZmZzZXQ6IG51bWJlciB9XG5cbi8qKiBIb2xkIGEgcG9zZSBmb3IgbiBmcmFtZXMgKDYwbXMgZWFjaCkuICovXG5mdW5jdGlvbiBob2xkKHBvc2U6IENsYXdkUG9zZSwgb2Zmc2V0OiBudW1iZXIsIGZyYW1lczogbnVtYmVyKTogRnJhbWVbXSB7XG4gIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBmcmFtZXMgfSwgKCkgPT4gKHsgcG9zZSwgb2Zmc2V0IH0pKVxufVxuXG4vLyBPZmZzZXQgc2VtYW50aWNzOiBtYXJnaW5Ub3AgaW4gYSBmaXhlZC1oZWlnaHQtMyBjb250YWluZXIuIDAgPSBub3JtYWwsXG4vLyAxID0gY3JvdWNoZWQuIENvbnRhaW5lciBoZWlnaHQgc3RheXMgMyBzbyB0aGUgbGF5b3V0IG5ldmVyIHNoaWZ0czsgZHVyaW5nXG4vLyBhIGNyb3VjaCAob2Zmc2V0PTEpIENsYXdkJ3MgZmVldCByb3cgZGlwcyBiZWxvdyB0aGUgY29udGFpbmVyIGFuZCBnZXRzXG4vLyBjbGlwcGVkIOKAlCByZWFkcyBhcyBcImR1Y2tpbmcgYmVsb3cgdGhlIGZyYW1lXCIgYmVmb3JlIHNwcmluZ2luZyBiYWNrIHVwLlxuXG4vLyBDbGljayBhbmltYXRpb246IGNyb3VjaCwgdGhlbiBzcHJpbmcgdXAgd2l0aCBib3RoIGFybXMgcmFpc2VkLiBUd2ljZS5cbmNvbnN0IEpVTVBfV0FWRTogcmVhZG9ubHkgRnJhbWVbXSA9IFtcbiAgLi4uaG9sZCgnZGVmYXVsdCcsIDEsIDIpLCAvLyBjcm91Y2hcbiAgLi4uaG9sZCgnYXJtcy11cCcsIDAsIDMpLCAvLyBzcHJpbmchXG4gIC4uLmhvbGQoJ2RlZmF1bHQnLCAwLCAxKSxcbiAgLi4uaG9sZCgnZGVmYXVsdCcsIDEsIDIpLCAvLyBjcm91Y2ggYWdhaW5cbiAgLi4uaG9sZCgnYXJtcy11cCcsIDAsIDMpLCAvLyBzcHJpbmchXG4gIC4uLmhvbGQoJ2RlZmF1bHQnLCAwLCAxKSxcbl1cblxuLy8gQ2xpY2sgYW5pbWF0aW9uOiBnbGFuY2UgcmlnaHQsIHRoZW4gbGVmdCwgdGhlbiBiYWNrLlxuY29uc3QgTE9PS19BUk9VTkQ6IHJlYWRvbmx5IEZyYW1lW10gPSBbXG4gIC4uLmhvbGQoJ2xvb2stcmlnaHQnLCAwLCA1KSxcbiAgLi4uaG9sZCgnbG9vay1sZWZ0JywgMCwgNSksXG4gIC4uLmhvbGQoJ2RlZmF1bHQnLCAwLCAxKSxcbl1cblxuY29uc3QgQ0xJQ0tfQU5JTUFUSU9OUzogcmVhZG9ubHkgKHJlYWRvbmx5IEZyYW1lW10pW10gPSBbSlVNUF9XQVZFLCBMT09LX0FST1VORF1cblxuY29uc3QgSURMRTogRnJhbWUgPSB7IHBvc2U6ICdkZWZhdWx0Jywgb2Zmc2V0OiAwIH1cbmNvbnN0IEZSQU1FX01TID0gNjBcbmNvbnN0IGluY3JlbWVudEZyYW1lID0gKGk6IG51bWJlcikgPT4gaSArIDFcbmNvbnN0IENMQVdEX0hFSUdIVCA9IDNcblxuLyoqXG4gKiBDbGF3ZCB3aXRoIGNsaWNrLXRyaWdnZXJlZCBhbmltYXRpb25zIChjcm91Y2gtanVtcCB3aXRoIGFybXMgdXAsIG9yXG4gKiBsb29rLWFyb3VuZCkuIENvbnRhaW5lciBoZWlnaHQgaXMgZml4ZWQgYXQgQ0xBV0RfSEVJR0hUIOKAlCBzYW1lIGZvb3RwcmludFxuICogYXMgYSBiYXJlIGA8Q2xhd2QgLz5gIOKAlCBzbyB0aGUgc3Vycm91bmRpbmcgbGF5b3V0IG5ldmVyIHNoaWZ0cy4gRHVyaW5nIGFcbiAqIGNyb3VjaCBvbmx5IHRoZSBmZWV0IHJvdyBjbGlwcyAoc2VlIGNvbW1lbnQgYWJvdmUpLiBDbGljayBvbmx5IGZpcmVzIHdoZW5cbiAqIG1vdXNlIHRyYWNraW5nIGlzIGVuYWJsZWQgKGkuZS4gaW5zaWRlIGA8QWx0ZXJuYXRlU2NyZWVuPmAgLyBmdWxsc2NyZWVuKTtcbiAqIGVsc2V3aGVyZSB0aGlzIHJlbmRlcnMgYW5kIGJlaGF2ZXMgaWRlbnRpY2FsbHkgdG8gcGxhaW4gYDxDbGF3ZCAvPmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBBbmltYXRlZENsYXdkKCk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGNvbnN0IHsgcG9zZSwgYm91bmNlT2Zmc2V0LCBvbkNsaWNrIH0gPSB1c2VDbGF3ZEFuaW1hdGlvbigpXG4gIHJldHVybiAoXG4gICAgPEJveCBoZWlnaHQ9e0NMQVdEX0hFSUdIVH0gZmxleERpcmVjdGlvbj1cImNvbHVtblwiIG9uQ2xpY2s9e29uQ2xpY2t9PlxuICAgICAgPEJveCBtYXJnaW5Ub3A9e2JvdW5jZU9mZnNldH0gZmxleFNocmluaz17MH0+XG4gICAgICAgIDxDbGF3ZCBwb3NlPXtwb3NlfSAvPlxuICAgICAgPC9Cb3g+XG4gICAgPC9Cb3g+XG4gIClcbn1cblxuZnVuY3Rpb24gdXNlQ2xhd2RBbmltYXRpb24oKToge1xuICBwb3NlOiBDbGF3ZFBvc2VcbiAgYm91bmNlT2Zmc2V0OiBudW1iZXJcbiAgb25DbGljazogKCkgPT4gdm9pZFxufSB7XG4gIC8vIFJlYWQgb25jZSBhdCBtb3VudCDigJQgbm8gdXNlU2V0dGluZ3MoKSBzdWJzY3JpcHRpb24sIHNpbmNlIHRoYXQgd291bGRcbiAgLy8gcmUtcmVuZGVyIG9uIGFueSBzZXR0aW5ncyBjaGFuZ2UuXG4gIGNvbnN0IFtyZWR1Y2VkTW90aW9uXSA9IHVzZVN0YXRlKFxuICAgICgpID0+IGdldEluaXRpYWxTZXR0aW5ncygpLnByZWZlcnNSZWR1Y2VkTW90aW9uID8/IGZhbHNlLFxuICApXG4gIGNvbnN0IFtmcmFtZUluZGV4LCBzZXRGcmFtZUluZGV4XSA9IHVzZVN0YXRlKC0xKVxuICBjb25zdCBzZXF1ZW5jZVJlZiA9IHVzZVJlZjxyZWFkb25seSBGcmFtZVtdPihKVU1QX1dBVkUpXG5cbiAgY29uc3Qgb25DbGljayA9ICgpID0+IHtcbiAgICBpZiAocmVkdWNlZE1vdGlvbiB8fCBmcmFtZUluZGV4ICE9PSAtMSkgcmV0dXJuXG4gICAgc2VxdWVuY2VSZWYuY3VycmVudCA9XG4gICAgICBDTElDS19BTklNQVRJT05TW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIENMSUNLX0FOSU1BVElPTlMubGVuZ3RoKV0hXG4gICAgc2V0RnJhbWVJbmRleCgwKVxuICB9XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoZnJhbWVJbmRleCA9PT0gLTEpIHJldHVyblxuICAgIGlmIChmcmFtZUluZGV4ID49IHNlcXVlbmNlUmVmLmN1cnJlbnQubGVuZ3RoKSB7XG4gICAgICBzZXRGcmFtZUluZGV4KC0xKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dChzZXRGcmFtZUluZGV4LCBGUkFNRV9NUywgaW5jcmVtZW50RnJhbWUpXG4gICAgcmV0dXJuICgpID0+IGNsZWFyVGltZW91dCh0aW1lcilcbiAgfSwgW2ZyYW1lSW5kZXhdKVxuXG4gIGNvbnN0IHNlcSA9IHNlcXVlbmNlUmVmLmN1cnJlbnRcbiAgY29uc3QgY3VycmVudCA9XG4gICAgZnJhbWVJbmRleCA+PSAwICYmIGZyYW1lSW5kZXggPCBzZXEubGVuZ3RoID8gc2VxW2ZyYW1lSW5kZXhdISA6IElETEVcbiAgcmV0dXJuIHsgcG9zZTogY3VycmVudC5wb3NlLCBib3VuY2VPZmZzZXQ6IGN1cnJlbnQub2Zmc2V0LCBvbkNsaWNrIH1cbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sS0FBS0EsS0FBSyxNQUFNLE9BQU87QUFDOUIsU0FBU0MsU0FBUyxFQUFFQyxNQUFNLEVBQUVDLFFBQVEsUUFBUSxPQUFPO0FBQ25ELFNBQVNDLEdBQUcsUUFBUSxjQUFjO0FBQ2xDLFNBQVNDLGtCQUFrQixRQUFRLGtDQUFrQztBQUNyRSxTQUFTQyxLQUFLLEVBQUUsS0FBS0MsU0FBUyxRQUFRLFlBQVk7QUFFbEQsS0FBS0MsS0FBSyxHQUFHO0VBQUVDLElBQUksRUFBRUYsU0FBUztFQUFFRyxNQUFNLEVBQUUsTUFBTTtBQUFDLENBQUM7O0FBRWhEO0FBQ0EsU0FBU0MsSUFBSUEsQ0FBQ0YsSUFBSSxFQUFFRixTQUFTLEVBQUVHLE1BQU0sRUFBRSxNQUFNLEVBQUVFLE1BQU0sRUFBRSxNQUFNLENBQUMsRUFBRUosS0FBSyxFQUFFLENBQUM7RUFDdEUsT0FBT0ssS0FBSyxDQUFDQyxJQUFJLENBQUM7SUFBRUMsTUFBTSxFQUFFSDtF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
|
|
|
|
| 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 {
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
import {
|
| 16 |
-
import {
|
| 17 |
-
import {
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
|
| 32 |
-
|
| 33 |
-
const
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 34 |
if (disabled) {
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
|
| 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 |
-
|
| 63 |
-
|
| 64 |
-
|
| 65 |
-
|
| 66 |
-
|
| 67 |
-
|
| 68 |
-
|
| 69 |
-
|
| 70 |
-
|
| 71 |
-
|
| 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 |
-
|
| 90 |
-
|
| 91 |
-
|
| 92 |
-
|
| 93 |
-
|
| 94 |
-
|
| 95 |
-
|
| 96 |
-
|
| 97 |
-
|
| 98 |
-
|
| 99 |
-
|
| 100 |
-
|
| 101 |
-
|
| 102 |
-
|
| 103 |
-
|
| 104 |
-
|
| 105 |
-
|
| 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 |
-
|
| 129 |
-
|
| 130 |
-
|
| 131 |
-
|
| 132 |
-
|
| 133 |
-
|
| 134 |
-
|
| 135 |
-
|
| 136 |
-
|
| 137 |
-
|
| 138 |
-
|
| 139 |
-
|
| 140 |
-
|
| 141 |
-
|
| 142 |
-
|
| 143 |
-
|
| 144 |
-
|
| 145 |
-
|
| 146 |
-
|
| 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'
|
|
|
|
|
|
|
| 201 |
}
|
| 202 |
-
|
| 203 |
-
|
| 204 |
-
|
| 205 |
-
|
| 206 |
-
|
|
|
|
|
|
|
| 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(
|
|
|
|
|
|
|
| 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 (
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 258 |
out.push({
|
| 259 |
entry,
|
| 260 |
-
why:
|
| 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
|
| 2 |
-
import
|
| 3 |
-
import {
|
| 4 |
-
|
| 5 |
-
export type ClawdPose =
|
|
|
|
|
|
|
| 6 |
| 'look-left' // both pupils shifted left
|
| 7 |
-
| 'look-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 |
-
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
| 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 |
-
|
| 184 |
-
|
| 185 |
-
|
| 186 |
-
pose
|
| 187 |
-
}
|
| 188 |
-
|
| 189 |
-
|
| 190 |
-
|
| 191 |
-
|
| 192 |
-
|
| 193 |
-
|
| 194 |
-
|
| 195 |
-
|
| 196 |
-
|
| 197 |
-
|
| 198 |
-
|
| 199 |
-
|
| 200 |
-
|
| 201 |
-
|
| 202 |
-
|
| 203 |
-
|
| 204 |
-
|
| 205 |
-
|
| 206 |
-
|
| 207 |
-
|
| 208 |
-
|
| 209 |
-
|
| 210 |
-
|
| 211 |
-
|
| 212 |
-
|
| 213 |
-
|
| 214 |
-
|
| 215 |
-
|
| 216 |
-
|
| 217 |
-
|
| 218 |
-
|
| 219 |
-
|
| 220 |
-
|
| 221 |
-
|
| 222 |
-
|
| 223 |
-
|
| 224 |
-
|
| 225 |
-
|
| 226 |
-
|
| 227 |
-
|
| 228 |
-
|
| 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
|
| 2 |
-
import
|
| 3 |
-
import {
|
| 4 |
-
import {
|
| 5 |
-
import {
|
| 6 |
-
import {
|
| 7 |
-
import {
|
| 8 |
-
import {
|
| 9 |
-
import {
|
| 10 |
-
import {
|
| 11 |
-
import {
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
import {
|
| 17 |
-
import {
|
| 18 |
-
import {
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 29 |
version,
|
| 30 |
-
|
| 31 |
-
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
const
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
|
| 47 |
-
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
|
| 63 |
-
|
| 64 |
-
|
| 65 |
-
|
| 66 |
-
|
| 67 |
-
|
| 68 |
-
|
| 69 |
-
|
| 70 |
-
|
| 71 |
-
|
| 72 |
-
|
| 73 |
-
|
| 74 |
-
|
| 75 |
-
|
| 76 |
-
|
| 77 |
-
|
| 78 |
-
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
|
| 82 |
-
|
| 83 |
-
|
| 84 |
-
|
| 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
|
| 2 |
-
import
|
| 3 |
-
import {
|
| 4 |
-
import {
|
| 5 |
-
|
| 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 |
-
|
| 17 |
-
|
| 18 |
-
};
|
| 19 |
-
};
|
| 20 |
type FeedProps = {
|
| 21 |
-
config: FeedConfig
|
| 22 |
-
actualWidth: number
|
| 23 |
-
}
|
|
|
|
| 24 |
export function calculateFeedWidth(config: FeedConfig): number {
|
| 25 |
-
const {
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
| 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(
|
|
|
|
|
|
|
|
|
|
|
|
|
| 40 |
for (const line of lines) {
|
| 41 |
-
const timestampWidth = maxTimestampWidth > 0 ? maxTimestampWidth : 0
|
| 42 |
-
const lineWidth =
|
| 43 |
-
|
|
|
|
|
|
|
| 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 |
-
|
|
|
|
| 108 |
}
|
| 109 |
-
|
| 110 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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
|
| 2 |
-
import
|
| 3 |
-
import {
|
| 4 |
-
import {
|
| 5 |
-
import
|
| 6 |
-
|
| 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 |
-
|
| 57 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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
|
| 2 |
-
import
|
| 3 |
-
import {
|
| 4 |
-
import {
|
| 5 |
-
import {
|
| 6 |
-
|
| 7 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
-
|
| 32 |
-
|
| 33 |
-
if (config.
|
| 34 |
-
return
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
const [show] = useState(_temp);
|
| 38 |
-
return show;
|
| 39 |
}
|
| 40 |
-
|
| 41 |
-
|
|
|
|
|
|
|
| 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
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
|
| 63 |
-
|
| 64 |
-
|
| 65 |
-
|
| 66 |
-
|
| 67 |
-
|
| 68 |
-
|
| 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 {
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
import {
|
| 18 |
-
import {
|
| 19 |
-
import {
|
| 20 |
-
import {
|
| 21 |
-
import {
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
import {
|
| 28 |
-
import {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 =
|
|
|
|
|
|
|
|
|
|
| 37 |
/* eslint-enable @typescript-eslint/no-require-imports */
|
| 38 |
-
import { SandboxManager } from 'src/utils/sandbox/sandbox-adapter.js'
|
| 39 |
-
import {
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
import {
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
|
| 47 |
-
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
}
|
| 61 |
-
const showOnboarding =
|
| 62 |
-
|
| 63 |
-
|
| 64 |
-
|
| 65 |
-
|
| 66 |
-
|
| 67 |
-
|
| 68 |
-
|
| 69 |
-
|
| 70 |
-
|
| 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
|
| 78 |
} catch {
|
| 79 |
-
changelog = []
|
| 80 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
| 81 |
const [announcement] = useState(() => {
|
| 82 |
-
const announcements = getInitialSettings().companyAnnouncements
|
| 83 |
-
if (!announcements || announcements.length === 0)
|
| 84 |
-
|
| 85 |
-
|
| 86 |
-
|
| 87 |
-
})
|
| 88 |
-
const {
|
| 89 |
-
|
| 90 |
-
|
| 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 |
-
|
| 166 |
-
|
| 167 |
-
|
| 168 |
-
|
| 169 |
-
|
| 170 |
-
|
| 171 |
-
|
| 172 |
-
|
| 173 |
-
|
| 174 |
-
|
| 175 |
-
|
| 176 |
-
|
| 177 |
-
if (pollTimer) clearInterval(pollTimer)
|
| 178 |
-
return
|
| 179 |
-
}
|
| 180 |
|
| 181 |
-
|
| 182 |
-
|
| 183 |
-
|
| 184 |
-
|
| 185 |
-
|
| 186 |
-
|
| 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 |
-
|
| 197 |
-
|
| 198 |
-
|
| 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 |
-
|
| 210 |
-
|
| 211 |
-
|
| 212 |
-
|
| 213 |
-
|
|
|
|
|
|
|
|
|
|
| 214 |
}
|
| 215 |
-
}, [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 216 |
const {
|
| 217 |
version,
|
| 218 |
cwd,
|
| 219 |
billingType,
|
| 220 |
-
agentName: agentNameFromSettings
|
| 221 |
-
} = getLogoDisplayData()
|
| 222 |
-
|
| 223 |
-
const
|
| 224 |
-
|
| 225 |
-
|
| 226 |
-
|
| 227 |
-
|
| 228 |
-
|
| 229 |
-
|
| 230 |
-
|
| 231 |
-
|
| 232 |
-
|
| 233 |
-
|
| 234 |
-
|
| 235 |
-
|
| 236 |
-
|
| 237 |
-
|
| 238 |
-
|
| 239 |
-
|
| 240 |
-
|
| 241 |
-
|
| 242 |
-
|
| 243 |
-
|
| 244 |
-
|
| 245 |
-
|
| 246 |
-
|
| 247 |
-
|
| 248 |
-
|
| 249 |
-
|
| 250 |
-
|
| 251 |
-
|
| 252 |
-
|
| 253 |
-
|
| 254 |
-
|
| 255 |
-
|
| 256 |
-
|
| 257 |
-
|
| 258 |
-
|
| 259 |
-
|
| 260 |
-
|
| 261 |
-
|
| 262 |
-
|
| 263 |
-
|
| 264 |
-
|
| 265 |
-
|
| 266 |
-
|
| 267 |
-
|
| 268 |
-
|
| 269 |
-
|
| 270 |
-
|
| 271 |
-
|
| 272 |
-
|
| 273 |
-
|
| 274 |
-
|
| 275 |
-
|
| 276 |
-
|
| 277 |
-
|
| 278 |
-
|
| 279 |
-
|
| 280 |
-
|
| 281 |
-
|
| 282 |
-
|
| 283 |
-
|
| 284 |
-
|
| 285 |
-
|
| 286 |
-
|
| 287 |
-
|
| 288 |
-
|
| 289 |
-
|
| 290 |
-
|
| 291 |
-
|
| 292 |
-
|
| 293 |
-
|
| 294 |
-
|
| 295 |
-
|
| 296 |
-
|
| 297 |
-
|
| 298 |
-
|
| 299 |
-
} else {
|
| 300 |
-
t23 = $[30];
|
| 301 |
-
}
|
| 302 |
-
return t23;
|
| 303 |
}
|
| 304 |
-
|
| 305 |
-
|
| 306 |
-
const
|
| 307 |
-
|
| 308 |
-
|
| 309 |
-
|
| 310 |
-
|
| 311 |
-
|
| 312 |
-
|
| 313 |
-
|
| 314 |
-
|
| 315 |
-
|
| 316 |
-
|
| 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 |
-
|
| 385 |
-
|
| 386 |
-
|
| 387 |
-
|
| 388 |
-
|
| 389 |
-
|
| 390 |
-
|
| 391 |
-
|
| 392 |
-
|
| 393 |
-
|
| 394 |
-
|
| 395 |
-
|
| 396 |
-
|
| 397 |
-
|
| 398 |
-
|
| 399 |
-
|
| 400 |
-
|
| 401 |
-
|
| 402 |
-
|
| 403 |
-
|
| 404 |
-
|
| 405 |
-
|
| 406 |
-
|
| 407 |
-
|
| 408 |
-
|
| 409 |
-
|
| 410 |
-
|
| 411 |
-
|
| 412 |
-
|
| 413 |
-
|
| 414 |
-
|
| 415 |
-
|
| 416 |
-
|
| 417 |
-
|
| 418 |
-
|
| 419 |
-
|
| 420 |
-
|
| 421 |
-
|
| 422 |
-
|
| 423 |
-
|
| 424 |
-
|
| 425 |
-
|
| 426 |
-
|
| 427 |
-
|
| 428 |
-
|
| 429 |
-
|
| 430 |
-
|
| 431 |
-
|
| 432 |
-
|
| 433 |
-
|
| 434 |
-
|
| 435 |
-
|
| 436 |
-
|
| 437 |
-
|
| 438 |
-
|
| 439 |
-
|
| 440 |
-
|
| 441 |
-
|
| 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 |
-
|
| 588 |
-
|
| 589 |
-
|
| 590 |
-
|
| 591 |
-
}
|
| 592 |
-
|
| 593 |
-
|
| 594 |
-
|
| 595 |
-
|
| 596 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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
|
| 2 |
-
import
|
| 3 |
-
import {
|
| 4 |
-
import {
|
| 5 |
-
import {
|
| 6 |
-
import {
|
| 7 |
-
import {
|
| 8 |
-
|
| 9 |
-
const MAX_SHOW_COUNT = 6
|
|
|
|
| 10 |
export function shouldShowOpus1mMergeNotice(): boolean {
|
| 11 |
-
return
|
|
|
|
|
|
|
|
|
|
| 12 |
}
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
const [show] = useState(shouldShowOpus1mMergeNotice)
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
}
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
|
| 35 |
-
|
| 36 |
-
|
| 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
|
| 2 |
-
import
|
| 3 |
-
import {
|
| 4 |
-
import {
|
| 5 |
-
import {
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
-
|
| 35 |
-
|
| 36 |
-
if (
|
| 37 |
-
|
|
|
|
|
|
|
|
|
|
| 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 |
-
|
| 53 |
-
|
| 54 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
-
|
| 82 |
-
|
| 83 |
-
|
| 84 |
-
|
| 85 |
-
|
| 86 |
-
|
| 87 |
-
|
| 88 |
-
|
| 89 |
-
|
| 90 |
-
|
| 91 |
-
|
| 92 |
-
|
| 93 |
-
if (
|
| 94 |
-
|
| 95 |
-
|
| 96 |
-
|
| 97 |
-
|
| 98 |
-
|
| 99 |
-
|
| 100 |
-
|
| 101 |
-
|
| 102 |
-
|
| 103 |
-
|
| 104 |
-
|
| 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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 {
|
| 2 |
-
import
|
| 3 |
-
import
|
| 4 |
-
import {
|
| 5 |
-
import {
|
| 6 |
-
import {
|
| 7 |
-
import {
|
| 8 |
-
import {
|
| 9 |
-
import {
|
| 10 |
-
|
| 11 |
-
const MAX_SHOW_COUNT = 3
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
$[0] = t0;
|
| 18 |
-
} else {
|
| 19 |
-
t0 = $[0];
|
| 20 |
-
}
|
| 21 |
-
return t0;
|
| 22 |
}
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
|
| 47 |
-
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
| 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
|
| 2 |
-
import
|
| 3 |
-
import {
|
| 4 |
-
|
| 5 |
-
const WELCOME_V2_WIDTH = 58
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
const [theme] = useTheme()
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
} else {
|
| 16 |
-
t0 = $[1];
|
| 17 |
-
}
|
| 18 |
-
return t0;
|
| 19 |
}
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
|
| 47 |
-
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
|
| 63 |
-
|
| 64 |
-
|
| 65 |
-
|
| 66 |
-
|
| 67 |
-
|
| 68 |
-
|
| 69 |
-
|
| 70 |
-
|
| 71 |
-
|
| 72 |
-
|
| 73 |
-
|
| 74 |
-
|
| 75 |
-
|
| 76 |
-
|
| 77 |
-
|
| 78 |
-
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
|
| 82 |
-
|
| 83 |
-
|
| 84 |
-
|
| 85 |
-
|
| 86 |
-
|
| 87 |
-
|
| 88 |
-
|
| 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 |
-
|
| 109 |
-
|
| 110 |
-
|
| 111 |
-
|
| 112 |
-
|
| 113 |
-
|
| 114 |
-
|
| 115 |
-
|
| 116 |
-
|
| 117 |
-
|
| 118 |
-
|
| 119 |
-
|
| 120 |
-
|
| 121 |
-
|
| 122 |
-
|
| 123 |
-
|
| 124 |
-
|
| 125 |
-
|
| 126 |
-
|
| 127 |
-
|
| 128 |
-
|
| 129 |
-
|
| 130 |
-
|
| 131 |
-
|
| 132 |
-
|
| 133 |
-
|
| 134 |
-
|
| 135 |
-
|
| 136 |
-
|
| 137 |
-
|
| 138 |
-
|
| 139 |
-
|
| 140 |
-
|
| 141 |
-
|
| 142 |
-
|
| 143 |
-
|
| 144 |
-
|
| 145 |
-
|
| 146 |
-
|
| 147 |
-
|
| 148 |
-
|
| 149 |
-
|
| 150 |
-
|
| 151 |
-
|
| 152 |
-
|
| 153 |
-
|
| 154 |
-
|
| 155 |
-
|
| 156 |
-
|
| 157 |
-
|
| 158 |
-
|
| 159 |
-
|
| 160 |
-
|
| 161 |
-
|
| 162 |
-
|
| 163 |
-
|
| 164 |
-
|
| 165 |
-
|
| 166 |
-
|
| 167 |
-
|
| 168 |
-
|
| 169 |
-
|
| 170 |
-
|
| 171 |
-
|
| 172 |
-
|
| 173 |
-
|
| 174 |
-
|
| 175 |
-
|
| 176 |
-
|
| 177 |
-
|
| 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 |
-
|
| 204 |
-
|
| 205 |
-
|
|
|
|
|
|
|
|
|
|
| 206 |
theme,
|
| 207 |
-
|
| 208 |
-
|
| 209 |
-
const isLightTheme = ["light", "light-daltonized", "light-ansi"].includes(theme);
|
| 210 |
if (isLightTheme) {
|
| 211 |
-
|
| 212 |
-
|
| 213 |
-
|
| 214 |
-
|
| 215 |
-
|
| 216 |
-
|
| 217 |
-
|
| 218 |
-
|
| 219 |
-
|
| 220 |
-
|
| 221 |
-
|
| 222 |
-
|
| 223 |
-
|
| 224 |
-
|
| 225 |
-
|
| 226 |
-
|
| 227 |
-
|
| 228 |
-
|
| 229 |
-
|
| 230 |
-
|
| 231 |
-
|
| 232 |
-
|
| 233 |
-
|
| 234 |
-
|
| 235 |
-
|
| 236 |
-
|
| 237 |
-
|
| 238 |
-
|
| 239 |
-
|
| 240 |
-
|
| 241 |
-
|
| 242 |
-
|
| 243 |
-
|
| 244 |
-
|
| 245 |
-
|
| 246 |
-
|
| 247 |
-
|
| 248 |
-
|
| 249 |
-
|
| 250 |
-
|
| 251 |
-
|
| 252 |
-
|
| 253 |
-
|
| 254 |
-
|
| 255 |
-
|
| 256 |
-
|
| 257 |
-
|
| 258 |
-
|
| 259 |
-
|
| 260 |
-
|
| 261 |
-
|
| 262 |
-
|
| 263 |
-
|
| 264 |
-
|
| 265 |
-
|
| 266 |
-
|
| 267 |
-
|
| 268 |
-
|
| 269 |
-
|
| 270 |
-
|
| 271 |
-
|
| 272 |
-
|
| 273 |
-
|
| 274 |
-
|
| 275 |
-
|
| 276 |
-
|
| 277 |
-
|
| 278 |
-
|
| 279 |
-
|
| 280 |
-
|
| 281 |
-
|
| 282 |
-
|
| 283 |
-
|
| 284 |
-
|
| 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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
}
|
|
|