mirror of
https://github.com/claude-code-best/claude-code.git
synced 2026-06-23 00:35:51 +00:00
更新大量 tsx 原始文件; 已经迁移 login panel; 部分 (#121)
* style(B1-1): 格式化 ink/buddy/cli/context/screens/tasks/services/keybindings/state (43 files) 纯格式化:移除分号、React Compiler import、import 多行展开。 修复了 Box.tsx 和 ScrollBox.tsx 中无效的 global.d.ts import。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * style(B1-2): 格式化 commands (79 files) 纯格式化:移除分号、React Compiler import、import 多行展开。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * style(B1-3): 格式化 components/messages,permissions,mcp,sandbox,shell (104 files) 纯格式化:移除分号、React Compiler import、import 多行展开。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * style(B1-4): 格式化 components/PromptInput,FeedbackSurvey,tasks,agents,skills,design-system,wizard (73 files) 纯格式化:移除分号、React Compiler import、import 多行展开。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * style(B1-5): 格式化 components其余 + hooks + tools (232 files) 纯格式化:移除分号、React Compiler import、import 多行展开。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * style(B1-6): 格式化 main/entrypoints/utils/moreright (21 files) 纯格式化:移除分号、React Compiler import、import 多行展开。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs: 更新 README,新增 Run.ps1/TODO.md,删除 V6.md - README.md: 大幅重写,更详细版本历史和配置示例 - Run.ps1: 新增 Windows 启动脚本 - TODO.md: 新增包完成清单 - V6.md: 删除(架构重构规划已不适用) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: 修复以前的问题 * fix: 修复 login 面板的问题 --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,13 +1,17 @@
|
||||
import { c as _c } from "react/compiler-runtime";
|
||||
import * as React from 'react';
|
||||
import { useState } from 'react';
|
||||
import { Text } from '../../ink.js';
|
||||
import { logEvent } from '../../services/analytics/index.js';
|
||||
import { formatGrantAmount, getCachedOverageCreditGrant, refreshOverageCreditGrantCache } from '../../services/api/overageCreditGrant.js';
|
||||
import { getGlobalConfig, saveGlobalConfig } from '../../utils/config.js';
|
||||
import { truncate } from '../../utils/format.js';
|
||||
import type { FeedConfig } from './Feed.js';
|
||||
const MAX_IMPRESSIONS = 3;
|
||||
import * as React from 'react'
|
||||
import { useState } from 'react'
|
||||
import { Text } from '../../ink.js'
|
||||
import { logEvent } from '../../services/analytics/index.js'
|
||||
import {
|
||||
formatGrantAmount,
|
||||
getCachedOverageCreditGrant,
|
||||
refreshOverageCreditGrantCache,
|
||||
} from '../../services/api/overageCreditGrant.js'
|
||||
import { getGlobalConfig, saveGlobalConfig } from '../../utils/config.js'
|
||||
import { truncate } from '../../utils/format.js'
|
||||
import type { FeedConfig } from './Feed.js'
|
||||
|
||||
const MAX_IMPRESSIONS = 3
|
||||
|
||||
/**
|
||||
* Whether to show the overage credit upsell on any surface.
|
||||
@@ -25,16 +29,20 @@ const MAX_IMPRESSIONS = 3;
|
||||
* (welcome feed, tips).
|
||||
*/
|
||||
export function isEligibleForOverageCreditGrant(): boolean {
|
||||
const info = getCachedOverageCreditGrant();
|
||||
if (!info || !info.available || info.granted) return false;
|
||||
return formatGrantAmount(info) !== null;
|
||||
const info = getCachedOverageCreditGrant()
|
||||
if (!info || !info.available || info.granted) return false
|
||||
return formatGrantAmount(info) !== null
|
||||
}
|
||||
|
||||
export function shouldShowOverageCreditUpsell(): boolean {
|
||||
if (!isEligibleForOverageCreditGrant()) return false;
|
||||
const config = getGlobalConfig();
|
||||
if (config.hasVisitedExtraUsage) return false;
|
||||
if ((config.overageCreditUpsellSeenCount ?? 0) >= MAX_IMPRESSIONS) return false;
|
||||
return true;
|
||||
if (!isEligibleForOverageCreditGrant()) return false
|
||||
|
||||
const config = getGlobalConfig()
|
||||
if (config.hasVisitedExtraUsage) return false
|
||||
if ((config.overageCreditUpsellSeenCount ?? 0) >= MAX_IMPRESSIONS)
|
||||
return false
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -42,105 +50,78 @@ export function shouldShowOverageCreditUpsell(): boolean {
|
||||
* unconditionally on mount — it no-ops if cache is fresh.
|
||||
*/
|
||||
export function maybeRefreshOverageCreditCache(): void {
|
||||
if (getCachedOverageCreditGrant() !== null) return;
|
||||
void refreshOverageCreditGrantCache();
|
||||
if (getCachedOverageCreditGrant() !== null) return
|
||||
void refreshOverageCreditGrantCache()
|
||||
}
|
||||
export function useShowOverageCreditUpsell() {
|
||||
const [show] = useState(_temp);
|
||||
return show;
|
||||
}
|
||||
function _temp() {
|
||||
maybeRefreshOverageCreditCache();
|
||||
return shouldShowOverageCreditUpsell();
|
||||
|
||||
export function useShowOverageCreditUpsell(): boolean {
|
||||
const [show] = useState(() => {
|
||||
maybeRefreshOverageCreditCache()
|
||||
return shouldShowOverageCreditUpsell()
|
||||
})
|
||||
return show
|
||||
}
|
||||
|
||||
export function incrementOverageCreditUpsellSeenCount(): void {
|
||||
let newCount = 0;
|
||||
let newCount = 0
|
||||
saveGlobalConfig(prev => {
|
||||
newCount = (prev.overageCreditUpsellSeenCount ?? 0) + 1;
|
||||
newCount = (prev.overageCreditUpsellSeenCount ?? 0) + 1
|
||||
return {
|
||||
...prev,
|
||||
overageCreditUpsellSeenCount: newCount
|
||||
};
|
||||
});
|
||||
logEvent('tengu_overage_credit_upsell_shown', {
|
||||
seen_count: newCount
|
||||
});
|
||||
overageCreditUpsellSeenCount: newCount,
|
||||
}
|
||||
})
|
||||
logEvent('tengu_overage_credit_upsell_shown', { seen_count: newCount })
|
||||
}
|
||||
|
||||
// Copy from "OC & Bulk Overages copy" doc (#6 — CLI /usage)
|
||||
function getUsageText(amount: string): string {
|
||||
return `${amount} in extra usage for third-party apps · /extra-usage`;
|
||||
return `${amount} in extra usage for third-party apps · /extra-usage`
|
||||
}
|
||||
|
||||
// Copy from "OC & Bulk Overages copy" doc (#4 — CLI Welcome screen).
|
||||
// Char budgets: title ≤19, subtitle ≤48.
|
||||
const FEED_SUBTITLE = 'On us. Works on third-party apps · /extra-usage';
|
||||
const FEED_SUBTITLE = 'On us. Works on third-party apps · /extra-usage'
|
||||
|
||||
function getFeedTitle(amount: string): string {
|
||||
return `${amount} in extra usage`;
|
||||
return `${amount} in extra usage`
|
||||
}
|
||||
type Props = {
|
||||
maxWidth?: number;
|
||||
twoLine?: boolean;
|
||||
};
|
||||
export function OverageCreditUpsell(t0) {
|
||||
const $ = _c(8);
|
||||
const {
|
||||
maxWidth,
|
||||
twoLine
|
||||
} = t0;
|
||||
let t1;
|
||||
let t2;
|
||||
if ($[0] !== maxWidth || $[1] !== twoLine) {
|
||||
t2 = Symbol.for("react.early_return_sentinel");
|
||||
bb0: {
|
||||
const info = getCachedOverageCreditGrant();
|
||||
if (!info) {
|
||||
t2 = null;
|
||||
break bb0;
|
||||
}
|
||||
const amount = formatGrantAmount(info);
|
||||
if (!amount) {
|
||||
t2 = null;
|
||||
break bb0;
|
||||
}
|
||||
if (twoLine) {
|
||||
const title = getFeedTitle(amount);
|
||||
let t3;
|
||||
if ($[4] !== maxWidth) {
|
||||
t3 = maxWidth ? truncate(FEED_SUBTITLE, maxWidth) : FEED_SUBTITLE;
|
||||
$[4] = maxWidth;
|
||||
$[5] = t3;
|
||||
} else {
|
||||
t3 = $[5];
|
||||
}
|
||||
let t4;
|
||||
if ($[6] !== t3) {
|
||||
t4 = <Text dimColor={true}>{t3}</Text>;
|
||||
$[6] = t3;
|
||||
$[7] = t4;
|
||||
} else {
|
||||
t4 = $[7];
|
||||
}
|
||||
t2 = <><Text color="claude">{maxWidth ? truncate(title, maxWidth) : title}</Text>{t4}</>;
|
||||
break bb0;
|
||||
}
|
||||
const text = getUsageText(amount);
|
||||
const display = maxWidth ? truncate(text, maxWidth) : text;
|
||||
const highlightLen = Math.min(getFeedTitle(amount).length, display.length);
|
||||
t1 = <Text dimColor={true}><Text color="claude">{display.slice(0, highlightLen)}</Text>{display.slice(highlightLen)}</Text>;
|
||||
}
|
||||
$[0] = maxWidth;
|
||||
$[1] = twoLine;
|
||||
$[2] = t1;
|
||||
$[3] = t2;
|
||||
} else {
|
||||
t1 = $[2];
|
||||
t2 = $[3];
|
||||
|
||||
type Props = { maxWidth?: number; twoLine?: boolean }
|
||||
|
||||
export function OverageCreditUpsell({
|
||||
maxWidth,
|
||||
twoLine,
|
||||
}: Props): React.ReactNode {
|
||||
const info = getCachedOverageCreditGrant()
|
||||
if (!info) return null
|
||||
const amount = formatGrantAmount(info)
|
||||
if (!amount) return null
|
||||
|
||||
if (twoLine) {
|
||||
const title = getFeedTitle(amount)
|
||||
return (
|
||||
<>
|
||||
<Text color="claude">
|
||||
{maxWidth ? truncate(title, maxWidth) : title}
|
||||
</Text>
|
||||
<Text dimColor>
|
||||
{maxWidth ? truncate(FEED_SUBTITLE, maxWidth) : FEED_SUBTITLE}
|
||||
</Text>
|
||||
</>
|
||||
)
|
||||
}
|
||||
if (t2 !== Symbol.for("react.early_return_sentinel")) {
|
||||
return t2;
|
||||
}
|
||||
return t1;
|
||||
|
||||
const text = getUsageText(amount)
|
||||
const display = maxWidth ? truncate(text, maxWidth) : text
|
||||
const highlightLen = Math.min(getFeedTitle(amount).length, display.length)
|
||||
|
||||
return (
|
||||
<Text dimColor>
|
||||
<Text color="claude">{display.slice(0, highlightLen)}</Text>
|
||||
{display.slice(highlightLen)}
|
||||
</Text>
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -151,15 +132,15 @@ export function OverageCreditUpsell(t0) {
|
||||
* Char budgets: title ≤19, subtitle ≤48.
|
||||
*/
|
||||
export function createOverageCreditFeed(): FeedConfig {
|
||||
const info = getCachedOverageCreditGrant();
|
||||
const amount = info ? formatGrantAmount(info) : null;
|
||||
const title = amount ? getFeedTitle(amount) : 'extra usage credit';
|
||||
const info = getCachedOverageCreditGrant()
|
||||
const amount = info ? formatGrantAmount(info) : null
|
||||
const title = amount ? getFeedTitle(amount) : 'extra usage credit'
|
||||
return {
|
||||
title,
|
||||
lines: [],
|
||||
customContent: {
|
||||
content: <Text dimColor>{FEED_SUBTITLE}</Text>,
|
||||
width: Math.max(title.length, FEED_SUBTITLE.length)
|
||||
}
|
||||
};
|
||||
width: Math.max(title.length, FEED_SUBTITLE.length),
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user