thatgfsj-code 3.0.1 → 3.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app/index.d.ts +6 -0
- package/dist/app/index.d.ts.map +1 -1
- package/dist/app/index.js +8 -0
- package/dist/app/index.js.map +1 -1
- package/dist/cache/index.d.ts +1 -1
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +1 -1
- package/dist/cache/index.js.map +1 -1
- package/dist/cache/smartModel.d.ts +68 -20
- package/dist/cache/smartModel.d.ts.map +1 -1
- package/dist/cache/smartModel.js +98 -20
- package/dist/cache/smartModel.js.map +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +6 -4
- package/dist/config/index.js.map +1 -1
- package/dist/config/types.d.ts +5 -1
- package/dist/config/types.d.ts.map +1 -1
- package/dist/llm/anthropic.d.ts +17 -0
- package/dist/llm/anthropic.d.ts.map +1 -1
- package/dist/llm/anthropic.js +25 -1
- package/dist/llm/anthropic.js.map +1 -1
- package/dist/llm/index.d.ts +9 -0
- package/dist/llm/index.d.ts.map +1 -1
- package/dist/llm/index.js +36 -1
- package/dist/llm/index.js.map +1 -1
- package/dist/llm/provider.d.ts +6 -1
- package/dist/llm/provider.d.ts.map +1 -1
- package/dist/tui/app.d.ts.map +1 -1
- package/dist/tui/app.js +17 -44
- package/dist/tui/app.js.map +1 -1
- package/dist/tui/components/Header.d.ts +7 -0
- package/dist/tui/components/Header.d.ts.map +1 -1
- package/dist/tui/components/Header.js +2 -2
- package/dist/tui/components/Header.js.map +1 -1
- package/dist/tui/components/InitWizard.d.ts +18 -9
- package/dist/tui/components/InitWizard.d.ts.map +1 -1
- package/dist/tui/components/InitWizard.js +76 -52
- package/dist/tui/components/InitWizard.js.map +1 -1
- package/dist/tui/hooks/useCommands.d.ts.map +1 -1
- package/dist/tui/hooks/useCommands.js +38 -0
- package/dist/tui/hooks/useCommands.js.map +1 -1
- package/package.json +1 -1
- package/src/app/index.ts +8 -0
- package/src/cache/index.ts +7 -1
- package/src/cache/smartModel.ts +113 -20
- package/src/config/index.ts +6 -4
- package/src/config/types.ts +5 -1
- package/src/llm/anthropic.ts +26 -1
- package/src/llm/index.ts +38 -1
- package/src/llm/provider.ts +6 -1
- package/src/tui/app.tsx +15 -56
- package/src/tui/components/Header.tsx +12 -2
- package/src/tui/components/InitWizard.tsx +103 -69
- package/src/tui/hooks/useCommands.ts +39 -0
- package/tests/cache/smartModel.test.ts +112 -0
package/dist/llm/index.js
CHANGED
|
@@ -14,6 +14,7 @@ import { PROVIDERS } from '../config/providers.js';
|
|
|
14
14
|
import { OpenAIProvider } from './openai.js';
|
|
15
15
|
import { AnthropicProvider } from './anthropic.js';
|
|
16
16
|
import { GeminiProvider } from './gemini.js';
|
|
17
|
+
import { decideTTL } from '../cache/smartModel.js';
|
|
17
18
|
export class LLMService {
|
|
18
19
|
provider;
|
|
19
20
|
tools = new Map();
|
|
@@ -22,6 +23,17 @@ export class LLMService {
|
|
|
22
23
|
this.provider = provider;
|
|
23
24
|
this.apiKey = apiKey;
|
|
24
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* v3.0.3: TTL resolved from config + smart routing. Stays null until
|
|
28
|
+
* the first round, then never changes for the session. Anthropic
|
|
29
|
+
* provider's setResolvedTTL is called at the same time, so the wire
|
|
30
|
+
* prefix is consistent across rounds.
|
|
31
|
+
*/
|
|
32
|
+
resolvedTtl = null;
|
|
33
|
+
/** Public accessor used by App.streamResponse to surface TTL in the UI. */
|
|
34
|
+
getResolvedTTL() {
|
|
35
|
+
return this.resolvedTtl;
|
|
36
|
+
}
|
|
25
37
|
static fromConfig(config) {
|
|
26
38
|
const providerName = config.provider || 'siliconflow';
|
|
27
39
|
const providerConfig = PROVIDERS[providerName];
|
|
@@ -33,7 +45,9 @@ export class LLMService {
|
|
|
33
45
|
maxTokens: config.maxTokens ?? 4096,
|
|
34
46
|
// v3.0.0: forward cache policy. Anthropic reads this to decide
|
|
35
47
|
// whether to attach cache_control markers; other providers ignore it.
|
|
36
|
-
|
|
48
|
+
// v3.0.3: ttl accepts '5m' | '1h' | 'auto'. 'auto' is resolved
|
|
49
|
+
// per-session by decideTTL() inside chatStream.
|
|
50
|
+
cache: config.cache ?? { enabled: true, ttl: 'auto', strategy: 'auto' },
|
|
37
51
|
};
|
|
38
52
|
const format = providerConfig.format;
|
|
39
53
|
let provider;
|
|
@@ -79,6 +93,27 @@ export class LLMService {
|
|
|
79
93
|
async *chatStream(messages, options) {
|
|
80
94
|
if (!this.hasApiKey())
|
|
81
95
|
throw new Error(this.getNoKeyMessage());
|
|
96
|
+
// v3.0.3: Resolve TTL once per session. If config says 'auto', call
|
|
97
|
+
// decideTTL to pick 5m (short sessions) or 1h (long ones). For
|
|
98
|
+
// non-Anthropic providers we don't need to do anything — cache
|
|
99
|
+
// markers are wired into the system regardless.
|
|
100
|
+
const configTtl = this.provider.config?.cache?.ttl;
|
|
101
|
+
if (configTtl === 'auto' && this.resolvedTtl === null) {
|
|
102
|
+
const decision = decideTTL(messages, null);
|
|
103
|
+
this.resolvedTtl = decision.ttl;
|
|
104
|
+
if (typeof this.provider.setResolvedTTL === 'function') {
|
|
105
|
+
this.provider.setResolvedTTL(decision.ttl);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
else if (configTtl === '5m' || configTtl === '1h') {
|
|
109
|
+
// User pinned a specific TTL — apply it once and keep it.
|
|
110
|
+
if (this.resolvedTtl === null) {
|
|
111
|
+
this.resolvedTtl = configTtl;
|
|
112
|
+
if (typeof this.provider.setResolvedTTL === 'function') {
|
|
113
|
+
this.provider.setResolvedTTL(configTtl);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
82
117
|
const maxIterations = options?.maxIterations ?? 10;
|
|
83
118
|
let currentMessages = [...messages];
|
|
84
119
|
let iterations = 0;
|
package/dist/llm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"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"}
|
package/dist/llm/provider.d.ts
CHANGED
|
@@ -45,10 +45,15 @@ export interface ProviderConfig {
|
|
|
45
45
|
* Optional cache control policy. When omitted, providers fall back to their
|
|
46
46
|
* default behavior (Anthropic: explicit cache_control markers; OpenAI / Gemini
|
|
47
47
|
* / DeepSeek: automatic prefix cache, no markers needed).
|
|
48
|
+
*
|
|
49
|
+
* v3.0.3: `ttl` accepts '5m' | '1h' | 'auto'. 'auto' lets the runtime
|
|
50
|
+
* decide per-session via decideTTL() in cache/smartModel.ts. The actual
|
|
51
|
+
* value used at request time is what gets stored on the provider's
|
|
52
|
+
* resolvedTtl field (set by LLMService.chatStream).
|
|
48
53
|
*/
|
|
49
54
|
cache?: {
|
|
50
55
|
enabled: boolean;
|
|
51
|
-
ttl?: '5m' | '1h';
|
|
56
|
+
ttl?: '5m' | '1h' | 'auto';
|
|
52
57
|
/**
|
|
53
58
|
* 'auto' — provider default (Anthropic: explicit, OpenAI/DeepSeek: auto)
|
|
54
59
|
* 'manual' — always emit cache_control markers regardless of provider
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/llm/provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,IAAI,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC5G,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAE9C;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG,iBAAiB,CAAC;AAE5C,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,6CAA6C;IAC7C,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAE5F;;;;;;;;OAQG;IACH,UAAU,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,GAAG,cAAc,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAEtH,iDAAiD;IACjD,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,GAAG,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/llm/provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,IAAI,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC5G,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAE9C;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG,iBAAiB,CAAC;AAE5C,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,6CAA6C;IAC7C,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAE5F;;;;;;;;OAQG;IACH,UAAU,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,GAAG,cAAc,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAEtH,iDAAiD;IACjD,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,GAAG,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;;;;;OASG;IACH,KAAK,CAAC,EAAE;QACN,OAAO,EAAE,OAAO,CAAC;QACjB,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC;QAC3B;;;;WAIG;QACH,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;KACtC,CAAC;CACH"}
|
package/dist/tui/app.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/tui/app.tsx"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,OAAO,KAA2C,MAAM,OAAO,CAAC;AAWhE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/tui/app.tsx"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,OAAO,KAA2C,MAAM,OAAO,CAAC;AAWhE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAM3C,UAAU,KAAK;IACb,GAAG,EAAE,GAAG,CAAC;CACV;AAkBD,wBAAgB,MAAM,CAAC,EAAE,GAAG,EAAE,EAAE,KAAK,qBAwHpC"}
|
package/dist/tui/app.js
CHANGED
|
@@ -36,59 +36,25 @@ export function TuiApp({ app }) {
|
|
|
36
36
|
const { handleCommand } = useCommands(app);
|
|
37
37
|
const [systemMessages, setSystemMessages] = useState([]);
|
|
38
38
|
const [viewMode, setViewMode] = useState('chat');
|
|
39
|
-
const [initProvider, setInitProvider] = useState('siliconflow');
|
|
40
|
-
const [initUrl, setInitUrl] = useState('');
|
|
41
39
|
const { stdout } = useStdout();
|
|
42
40
|
const terminalWidth = stdout?.columns || 80;
|
|
43
41
|
// v3.0.0: cache stats snapshot for the Header. Re-read whenever messages
|
|
44
42
|
// change (i.e. a round just completed and recorded new usage). Polling on
|
|
45
43
|
// an interval would be wasteful; React re-render is the trigger.
|
|
46
44
|
const [cacheSnapshot, setCacheSnapshot] = useState(() => app.cacheStats.snapshot());
|
|
45
|
+
// v3.0.3: resolved TTL (sticky per session). null until first round.
|
|
46
|
+
const [resolvedTtl, setResolvedTtl] = useState(app.resolvedTtl);
|
|
47
|
+
// The user-pinned config TTL ('auto' | '5m' | '1h') — used to render the
|
|
48
|
+
// Header chip BEFORE the first round, when resolvedTtl is still null.
|
|
49
|
+
const configTtl = app.config.get().cache?.ttl;
|
|
47
50
|
useEffect(() => {
|
|
48
51
|
setCacheSnapshot(app.cacheStats.snapshot());
|
|
52
|
+
setResolvedTtl(app.resolvedTtl);
|
|
49
53
|
}, [messages.length]);
|
|
50
54
|
const addMsg = useCallback((content) => {
|
|
51
55
|
setSystemMessages(prev => [...prev, { role: 'assistant', content }]);
|
|
52
56
|
}, []);
|
|
53
57
|
const onSubmit = useCallback(async (input) => {
|
|
54
|
-
// Init wizard - API Key input
|
|
55
|
-
if (viewMode === 'init_key') {
|
|
56
|
-
const key = input.trim();
|
|
57
|
-
if (!key) {
|
|
58
|
-
setViewMode('chat');
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
// Save and complete
|
|
62
|
-
const { App: AppClass } = await import('../app/index.js');
|
|
63
|
-
const cfg = app.config.get();
|
|
64
|
-
app.config.save({ provider: initProvider, apiKey: key, model: cfg.model || 'default' });
|
|
65
|
-
saveModelToHistory(cfg.model || 'default');
|
|
66
|
-
setViewMode('chat');
|
|
67
|
-
addMsg(`配置已更新: ${initProvider}`);
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
// Init wizard - Custom URL input
|
|
71
|
-
if (viewMode === 'init_url') {
|
|
72
|
-
const url = input.trim();
|
|
73
|
-
if (!url) {
|
|
74
|
-
setViewMode('chat');
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
setInitUrl(url);
|
|
78
|
-
setViewMode('init_key');
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
// Init wizard - Custom model name
|
|
82
|
-
if (viewMode === 'init_custom_model') {
|
|
83
|
-
const model = input.trim();
|
|
84
|
-
if (model) {
|
|
85
|
-
app.config.save({ model });
|
|
86
|
-
saveModelToHistory(model);
|
|
87
|
-
addMsg(`模型已切换: ${model}`);
|
|
88
|
-
}
|
|
89
|
-
setViewMode('chat');
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
58
|
// Model selector - ignore text input
|
|
93
59
|
if (viewMode === 'model_select')
|
|
94
60
|
return;
|
|
@@ -114,19 +80,26 @@ export function TuiApp({ app }) {
|
|
|
114
80
|
return;
|
|
115
81
|
}
|
|
116
82
|
sendMessage(input);
|
|
117
|
-
}, [handleCommand, sendMessage, app, viewMode,
|
|
83
|
+
}, [handleCommand, sendMessage, app, viewMode, addMsg]);
|
|
118
84
|
const allMessages = [...systemMessages, ...messages];
|
|
119
85
|
const activeSkills = app.skills.listActive().map(s => s.id);
|
|
120
|
-
return (_jsxs(Box, { flexDirection: "column", paddingX: 1, children: [_jsx(Header, { provider: app.config.get().provider, model: app.config.get().model, cacheHitRate: cacheSnapshot.hitRate > 0 ? cacheSnapshot.hitRate : null, cacheSavingsCNY: cacheSnapshot.estimatedSavingsCNY }), _jsx(ChatList, { messages: allMessages, streaming: streaming, streamingToolCalls: streamingToolCalls, width: terminalWidth - 4 }), _jsx(Thinking, { active: isThinking }), queuedMessage && (_jsxs(Box, { paddingLeft: 1, children: [_jsx(Text, { color: "#F59E0B", children: "\uD83D\uDCCE \u5DF2\u6392\u961F: " }), _jsx(Text, { color: "#94A3B8", children: queuedMessage })] })), viewMode === 'model_select' ? (_jsx(ModelSelector, { currentModel: app.config.get().model, currentProvider: app.config.get().provider, onSelect: (model) => {
|
|
86
|
+
return (_jsxs(Box, { flexDirection: "column", paddingX: 1, children: [_jsx(Header, { provider: app.config.get().provider, model: app.config.get().model, cacheHitRate: cacheSnapshot.hitRate > 0 ? cacheSnapshot.hitRate : null, cacheSavingsCNY: cacheSnapshot.estimatedSavingsCNY, cacheTtl: resolvedTtl ?? configTtl ?? null }), _jsx(ChatList, { messages: allMessages, streaming: streaming, streamingToolCalls: streamingToolCalls, width: terminalWidth - 4 }), _jsx(Thinking, { active: isThinking }), queuedMessage && (_jsxs(Box, { paddingLeft: 1, children: [_jsx(Text, { color: "#F59E0B", children: "\uD83D\uDCCE \u5DF2\u6392\u961F: " }), _jsx(Text, { color: "#94A3B8", children: queuedMessage })] })), viewMode === 'model_select' ? (_jsx(ModelSelector, { currentModel: app.config.get().model, currentProvider: app.config.get().provider, onSelect: (model) => {
|
|
121
87
|
app.config.save({ model });
|
|
122
88
|
saveModelToHistory(model);
|
|
123
89
|
setViewMode('chat');
|
|
124
90
|
addMsg(`模型已切换: ${model}`);
|
|
125
|
-
}, onAddNew: () => setViewMode('init_wizard') })) : viewMode === 'init_wizard' ? (
|
|
91
|
+
}, onAddNew: () => setViewMode('init_wizard') })) : viewMode === 'init_wizard' ? (
|
|
92
|
+
// v3.0.1: InitWizard is now fully self-contained — it owns its own
|
|
93
|
+
// input handling via useInput + ink-text-input. No external UserInput
|
|
94
|
+
// is rendered here, and app.tsx no longer has the text-entry
|
|
95
|
+
// viewModes (init_key / init_url / init_custom_model) because they
|
|
96
|
+
// were the broken input-handling path that left users stuck on a
|
|
97
|
+
// frozen "输入 API Key" screen with no way to type.
|
|
98
|
+
_jsx(InitWizard, { onComplete: (provider, model, apiKey, baseUrl) => {
|
|
126
99
|
app.config.save({ provider, model, apiKey, baseUrl });
|
|
127
100
|
saveModelToHistory(model);
|
|
128
101
|
setViewMode('chat');
|
|
129
102
|
addMsg(`配置完成: ${provider} / ${model}`);
|
|
130
|
-
}, onCancel: () => setViewMode('chat') })) : (
|
|
103
|
+
}, onCancel: () => setViewMode('chat') })) : (_jsx(Box, { flexDirection: "column", children: _jsx(UserInput, { onSubmit: onSubmit, onCancel: cancel, disabled: false }) })), _jsx(StatusBar, { messageCount: allMessages.length, skills: activeSkills })] }));
|
|
131
104
|
}
|
|
132
105
|
//# sourceMappingURL=app.js.map
|
package/dist/tui/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/tui/app.tsx"],"names":[],"mappings":";AAAA,6BAA6B;AAC7B,OAAc,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAChE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/tui/app.tsx"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,13 @@ interface Props {
|
|
|
11
11
|
*/
|
|
12
12
|
cacheHitRate?: number | null;
|
|
13
13
|
cacheSavingsCNY?: number;
|
|
14
|
+
/**
|
|
15
|
+
* v3.0.3: cache TTL marker. '5m' (default for short sessions) or '1h'
|
|
16
|
+
* (auto-decided for long sessions, or pinned by the user). 'auto' is
|
|
17
|
+
* the user-pinned setting and shows up as ⏱ auto. null = not yet
|
|
18
|
+
* decided (waiting for first round).
|
|
19
|
+
*/
|
|
20
|
+
cacheTtl?: '5m' | '1h' | 'auto' | null;
|
|
14
21
|
}
|
|
15
22
|
export declare const Header: React.NamedExoticComponent<Props>;
|
|
16
23
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../../src/tui/components/Header.tsx"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,UAAU,KAAK;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../../src/tui/components/Header.tsx"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,UAAU,KAAK;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC;CACxC;AAcD,eAAO,MAAM,MAAM,mCA6BjB,CAAC"}
|
|
@@ -15,8 +15,8 @@ function hitRateColor(rate) {
|
|
|
15
15
|
return '#F59E0B';
|
|
16
16
|
return '#6B7280';
|
|
17
17
|
}
|
|
18
|
-
export const Header = React.memo(function Header({ provider, model, cacheHitRate, cacheSavingsCNY }) {
|
|
18
|
+
export const Header = React.memo(function Header({ provider, model, cacheHitRate, cacheSavingsCNY, cacheTtl }) {
|
|
19
19
|
const showCache = typeof cacheHitRate === 'number' && cacheHitRate > 0;
|
|
20
|
-
return (_jsxs(Box, { flexDirection: "column", marginBottom: 0, children: [_jsxs(Box, { justifyContent: "space-between", width: "100%", children: [_jsxs(Box, { children: [_jsx(Text, { color: "#06B6D4", bold: true, children: " \u26A1 " }), _jsx(Text, { color: "#22D3EE", bold: true, children: "THATGFSJ CODE" }), _jsx(Text, { dimColor: true, children: " v3.0.
|
|
20
|
+
return (_jsxs(Box, { flexDirection: "column", marginBottom: 0, children: [_jsxs(Box, { justifyContent: "space-between", width: "100%", children: [_jsxs(Box, { children: [_jsx(Text, { color: "#06B6D4", bold: true, children: " \u26A1 " }), _jsx(Text, { color: "#22D3EE", bold: true, children: "THATGFSJ CODE" }), _jsx(Text, { dimColor: true, children: " v3.0.3" })] }), _jsxs(Box, { children: [showCache && (_jsxs(_Fragment, { children: [_jsxs(Text, { color: hitRateColor(cacheHitRate), bold: true, children: [" \u26A1 ", (cacheHitRate * 100).toFixed(1), "% "] }), _jsxs(Text, { dimColor: true, children: [" \u00B7 \u8282\u7701 \u00A5", (cacheSavingsCNY ?? 0).toFixed(2), " "] }), _jsx(Text, { dimColor: true, children: " \u00B7 " })] })), cacheTtl && (_jsxs(Text, { color: "#A78BFA", bold: true, children: [" \u23F1 ", cacheTtl, " "] })), _jsxs(Text, { color: "#06B6D4", bold: true, children: [" ", provider, " "] }), _jsx(Text, { dimColor: true, children: "/" }), _jsxs(Text, { color: "#22D3EE", children: [" ", model, " "] })] })] }), _jsx(Text, { color: "#374151", children: '─'.repeat(80) })] }));
|
|
21
21
|
});
|
|
22
22
|
//# sourceMappingURL=Header.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Header.js","sourceRoot":"","sources":["../../../src/tui/components/Header.tsx"],"names":[],"mappings":";AAAA,6BAA6B;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"Header.js","sourceRoot":"","sources":["../../../src/tui/components/Header.tsx"],"names":[],"mappings":";AAAA,6BAA6B;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAsBhC;;;;;GAKG;AACH,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,IAAI,IAAI,GAAG;QAAE,OAAO,SAAS,CAAC;IAClC,IAAI,IAAI,IAAI,GAAG;QAAE,OAAO,SAAS,CAAC;IAClC,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAS;IAClH,MAAM,SAAS,GAAG,OAAO,YAAY,KAAK,QAAQ,IAAI,YAAY,GAAG,CAAC,CAAC;IACvE,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC,aACzC,MAAC,GAAG,IAAC,cAAc,EAAC,eAAe,EAAC,KAAK,EAAC,MAAM,aAC9C,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAC,SAAS,EAAC,IAAI,+BAAW,EACrC,KAAC,IAAI,IAAC,KAAK,EAAC,SAAS,EAAC,IAAI,oCAAqB,EAC/C,KAAC,IAAI,IAAC,QAAQ,8BAAe,IACzB,EACN,MAAC,GAAG,eACD,SAAS,IAAI,CACZ,8BACE,MAAC,IAAI,IAAC,KAAK,EAAE,YAAY,CAAC,YAAa,CAAC,EAAE,IAAI,+BAAK,CAAC,YAAa,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,EAC7F,MAAC,IAAI,IAAC,QAAQ,kDAAS,CAAC,eAAe,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EACjE,KAAC,IAAI,IAAC,QAAQ,+BAAW,IACxB,CACJ,EACA,QAAQ,IAAI,CACX,MAAC,IAAI,IAAC,KAAK,EAAC,SAAS,EAAC,IAAI,+BAAK,QAAQ,SAAS,CACjD,EACD,MAAC,IAAI,IAAC,KAAK,EAAC,SAAS,EAAC,IAAI,wBAAG,QAAQ,SAAS,EAC9C,KAAC,IAAI,IAAC,QAAQ,wBAAS,EACvB,MAAC,IAAI,IAAC,KAAK,EAAC,SAAS,kBAAG,KAAK,SAAS,IAClC,IACF,EACN,KAAC,IAAI,IAAC,KAAK,EAAC,SAAS,YAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAQ,IACzC,CACP,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -6,17 +6,26 @@ interface Props {
|
|
|
6
6
|
onComplete: (provider: ProviderName, model: string, apiKey: string, baseUrl?: string) => void;
|
|
7
7
|
onCancel: () => void;
|
|
8
8
|
}
|
|
9
|
-
type InitStep = 'provider' | '
|
|
9
|
+
type InitStep = 'provider' | 'custom_url' | 'api_key' | 'model' | 'custom_model' | 'cache_strategy';
|
|
10
10
|
/**
|
|
11
|
-
* v3.0.
|
|
12
|
-
*
|
|
13
|
-
*
|
|
11
|
+
* v3.0.1: InitWizard is now fully self-contained — it manages its own
|
|
12
|
+
* step state AND its own keyboard input for text-entry steps (api_key,
|
|
13
|
+
* custom_url, custom_model). The previous version had a fatal bug:
|
|
14
14
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
15
|
+
* The text-entry steps (`api_key`, `custom_url`, `custom_model`) only
|
|
16
|
+
* rendered a `<Text>` prompt with no actual input box. The host
|
|
17
|
+
* component (app.tsx) had its own UserInput BUT only rendered it when
|
|
18
|
+
* viewMode was NOT 'init_wizard' (see app.tsx ternary). So when the
|
|
19
|
+
* wizard's internal step advanced to 'api_key', the user could SEE the
|
|
20
|
+
* "输入 API Key: 服务商: deepseek" prompt but had NO way to type into
|
|
21
|
+
* it. Ink silently swallowed keystrokes (no useInput handler was
|
|
22
|
+
* active), and the user was stuck on a frozen screen — exactly the
|
|
23
|
+
* bug that prompted the user-reported "选择 deepseek 然后退出":
|
|
24
|
+
* pressing Ctrl+C felt like the only escape.
|
|
25
|
+
*
|
|
26
|
+
* Fix: this file now uses `useInput` and `ink-text-input` for the text
|
|
27
|
+
* steps. The SetViewMode-based input delegation in app.tsx is no longer
|
|
28
|
+
* required for the InitWizard flow.
|
|
20
29
|
*/
|
|
21
30
|
export declare function InitWizard({ onComplete, onCancel }: Props): React.JSX.Element | null;
|
|
22
31
|
export type { InitStep };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InitWizard.d.ts","sourceRoot":"","sources":["../../../src/tui/components/InitWizard.tsx"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,OAAO,
|
|
1
|
+
{"version":3,"file":"InitWizard.d.ts","sourceRoot":"","sources":["../../../src/tui/components/InitWizard.tsx"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,OAAO,KAAmB,MAAM,OAAO,CAAC;AAOxC,OAAO,EAAuC,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,UAAU,KAAK;IACb,UAAU,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9F,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,KAAK,QAAQ,GAAG,UAAU,GAAG,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,cAAc,GAAG,gBAAgB,CAAC;AAOpG;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,UAAU,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,KAAK,4BA2MzD;AAGD,YAAY,EAAE,QAAQ,EAAE,CAAC;AACzB,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -1,22 +1,32 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
/** @jsxImportSource react */
|
|
3
3
|
import { useState } from 'react';
|
|
4
|
-
import { Box, Text } from 'ink';
|
|
4
|
+
import { Box, Text, useInput } from 'ink';
|
|
5
5
|
import SelectInput from 'ink-select-input';
|
|
6
|
-
import
|
|
6
|
+
import TextInput from 'ink-text-input';
|
|
7
|
+
import { writeFileSync, existsSync, mkdirSync } from 'fs';
|
|
7
8
|
import { join } from 'path';
|
|
8
9
|
import { homedir } from 'os';
|
|
9
10
|
import { listProviders, getModelsForProvider, isCustomProvider } from '../../config/providers.js';
|
|
10
11
|
/**
|
|
11
|
-
* v3.0.
|
|
12
|
-
*
|
|
13
|
-
*
|
|
12
|
+
* v3.0.1: InitWizard is now fully self-contained — it manages its own
|
|
13
|
+
* step state AND its own keyboard input for text-entry steps (api_key,
|
|
14
|
+
* custom_url, custom_model). The previous version had a fatal bug:
|
|
14
15
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
16
|
+
* The text-entry steps (`api_key`, `custom_url`, `custom_model`) only
|
|
17
|
+
* rendered a `<Text>` prompt with no actual input box. The host
|
|
18
|
+
* component (app.tsx) had its own UserInput BUT only rendered it when
|
|
19
|
+
* viewMode was NOT 'init_wizard' (see app.tsx ternary). So when the
|
|
20
|
+
* wizard's internal step advanced to 'api_key', the user could SEE the
|
|
21
|
+
* "输入 API Key: 服务商: deepseek" prompt but had NO way to type into
|
|
22
|
+
* it. Ink silently swallowed keystrokes (no useInput handler was
|
|
23
|
+
* active), and the user was stuck on a frozen screen — exactly the
|
|
24
|
+
* bug that prompted the user-reported "选择 deepseek 然后退出":
|
|
25
|
+
* pressing Ctrl+C felt like the only escape.
|
|
26
|
+
*
|
|
27
|
+
* Fix: this file now uses `useInput` and `ink-text-input` for the text
|
|
28
|
+
* steps. The SetViewMode-based input delegation in app.tsx is no longer
|
|
29
|
+
* required for the InitWizard flow.
|
|
20
30
|
*/
|
|
21
31
|
export function InitWizard({ onComplete, onCancel }) {
|
|
22
32
|
const [step, setStep] = useState('provider');
|
|
@@ -39,7 +49,6 @@ export function InitWizard({ onComplete, onCancel }) {
|
|
|
39
49
|
temperature: 0.7,
|
|
40
50
|
maxTokens: 4096,
|
|
41
51
|
contextLength: 50,
|
|
42
|
-
// v3.0.0: cache policy from wizard
|
|
43
52
|
cache: {
|
|
44
53
|
enabled: cacheChoice.enabled,
|
|
45
54
|
ttl: cacheChoice.ttl,
|
|
@@ -49,26 +58,23 @@ export function InitWizard({ onComplete, onCancel }) {
|
|
|
49
58
|
if (url)
|
|
50
59
|
config.baseUrl = url;
|
|
51
60
|
writeFileSync(configPath, JSON.stringify(config, null, 2));
|
|
52
|
-
// Save to models history
|
|
53
|
-
const historyPath = join(dir, 'models.json');
|
|
54
|
-
let history = [];
|
|
55
|
-
if (existsSync(historyPath)) {
|
|
56
|
-
try {
|
|
57
|
-
history = JSON.parse(readFileSync(historyPath, 'utf-8'));
|
|
58
|
-
}
|
|
59
|
-
catch { }
|
|
60
|
-
}
|
|
61
|
-
if (!history.includes(model)) {
|
|
62
|
-
history.push(model);
|
|
63
|
-
writeFileSync(historyPath, JSON.stringify(history, null, 2));
|
|
64
|
-
}
|
|
65
61
|
};
|
|
62
|
+
// v3.0.1: ESC cancels the wizard from any text-entry step. This is the
|
|
63
|
+
// hook that the previous version was missing — when the user pressed
|
|
64
|
+
// ESC on the frozen "输入 API Key" screen, nothing happened because no
|
|
65
|
+
// useInput was active. Now it bails out cleanly.
|
|
66
|
+
useInput((_input, key) => {
|
|
67
|
+
if (key.escape && (step === 'api_key' || step === 'custom_url' || step === 'custom_model')) {
|
|
68
|
+
onCancel();
|
|
69
|
+
}
|
|
70
|
+
});
|
|
66
71
|
// Step 1: Provider selection
|
|
67
72
|
if (step === 'provider') {
|
|
68
73
|
const items = providers.map(p => ({ label: p.name, value: p.key }));
|
|
69
74
|
return (_jsxs(Box, { flexDirection: "column", paddingLeft: 1, children: [_jsx(Text, { color: "#06B6D4", bold: true, children: "\u9009\u62E9\u670D\u52A1\u5546 (\u2191\u2193 \u56DE\u8F66):" }), _jsx(SelectInput, { items: items, onSelect: (item) => {
|
|
70
|
-
|
|
71
|
-
|
|
75
|
+
const provider = item.value;
|
|
76
|
+
setSelectedProvider(provider);
|
|
77
|
+
if (isCustomProvider(provider)) {
|
|
72
78
|
setStep('custom_url');
|
|
73
79
|
}
|
|
74
80
|
else {
|
|
@@ -76,13 +82,31 @@ export function InitWizard({ onComplete, onCancel }) {
|
|
|
76
82
|
}
|
|
77
83
|
} })] }));
|
|
78
84
|
}
|
|
79
|
-
// Custom URL input
|
|
85
|
+
// Custom URL input — v3.0.1 NOW has a real TextInput
|
|
80
86
|
if (step === 'custom_url') {
|
|
81
|
-
return (_jsxs(Box, { flexDirection: "column", paddingLeft: 1, children: [_jsx(Text, { color: "#06B6D4", bold: true, children: "\u8F93\u5165\u4E2D\u8F6C\u7AD9 URL:" }), _jsx(Text, { dimColor: true, children: "\u4F8B\u5982: https://api.example.com/v1" }), _jsx(Text, { color: "#F59E0B", children: "\uFF08\u8BF7\u76F4\u63A5\u8F93\u5165 URL \u5E76\u56DE\u8F66\uFF09" })
|
|
87
|
+
return (_jsxs(Box, { flexDirection: "column", paddingLeft: 1, children: [_jsx(Text, { color: "#06B6D4", bold: true, children: "\u8F93\u5165\u4E2D\u8F6C\u7AD9 URL:" }), _jsx(Text, { dimColor: true, children: "\u4F8B\u5982: https://api.example.com/v1" }), _jsx(Text, { color: "#F59E0B", children: "\uFF08\u8BF7\u76F4\u63A5\u8F93\u5165 URL \u5E76\u56DE\u8F66\uFF0CESC \u53D6\u6D88\uFF09" }), _jsxs(Box, { marginTop: 1, children: [_jsx(Text, { color: "#06B6D4", children: "\u276F " }), _jsx(TextInput, { value: customUrl, onChange: setCustomUrl, onSubmit: (value) => {
|
|
88
|
+
if (value.trim()) {
|
|
89
|
+
setCustomUrl(value.trim());
|
|
90
|
+
setStep('api_key');
|
|
91
|
+
}
|
|
92
|
+
} })] })] }));
|
|
82
93
|
}
|
|
83
|
-
// Step 2: API Key
|
|
94
|
+
// Step 2: API Key — v3.0.1 NOW has a real TextInput
|
|
84
95
|
if (step === 'api_key') {
|
|
85
|
-
|
|
96
|
+
const providerLabel = providers.find(p => p.key === selectedProvider)?.name || selectedProvider;
|
|
97
|
+
return (_jsxs(Box, { flexDirection: "column", paddingLeft: 1, children: [_jsx(Text, { color: "#06B6D4", bold: true, children: "\u8F93\u5165 API Key:" }), _jsxs(Text, { dimColor: true, children: ["\u670D\u52A1\u5546: ", providerLabel] }), _jsx(Text, { color: "#F59E0B", children: "\uFF08\u8BF7\u76F4\u63A5\u8F93\u5165 Key \u5E76\u56DE\u8F66\uFF0CESC \u53D6\u6D88\uFF09" }), _jsxs(Box, { marginTop: 1, children: [_jsx(Text, { color: "#06B6D4", children: "\u276F " }), _jsx(TextInput, { value: apiKey, onChange: setApiKey, onSubmit: (value) => {
|
|
98
|
+
if (value.trim()) {
|
|
99
|
+
setApiKey(value.trim());
|
|
100
|
+
if (isCustomProvider(selectedProvider)) {
|
|
101
|
+
// Custom OpenAI/Anthropic: after key, go to model
|
|
102
|
+
setStep('model');
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
// Standard providers: skip to model selection
|
|
106
|
+
setStep('model');
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
} })] })] }));
|
|
86
110
|
}
|
|
87
111
|
// Step 3: Model selection
|
|
88
112
|
if (step === 'model') {
|
|
@@ -96,41 +120,41 @@ export function InitWizard({ onComplete, onCancel }) {
|
|
|
96
120
|
}
|
|
97
121
|
else {
|
|
98
122
|
setSelectedModel(item.value);
|
|
99
|
-
// v3.0.0: prompt the user for cache strategy after model.
|
|
100
123
|
setStep('cache_strategy');
|
|
101
124
|
}
|
|
102
125
|
} })] }));
|
|
103
126
|
}
|
|
104
|
-
// Custom model name
|
|
127
|
+
// Custom model name input — v3.0.1 NOW has a real TextInput
|
|
105
128
|
if (step === 'custom_model') {
|
|
106
|
-
return (_jsxs(Box, { flexDirection: "column", paddingLeft: 1, children: [_jsx(Text, { color: "#06B6D4", bold: true, children: "\u8F93\u5165\u6A21\u578B\u540D\u79F0:" }), _jsx(Text, { color: "#F59E0B", children: "\uFF08\u8BF7\u76F4\u63A5\u8F93\u5165\u6A21\u578B\u540D\u5E76\u56DE\u8F66\uFF09" })
|
|
129
|
+
return (_jsxs(Box, { flexDirection: "column", paddingLeft: 1, children: [_jsx(Text, { color: "#06B6D4", bold: true, children: "\u8F93\u5165\u6A21\u578B\u540D\u79F0:" }), _jsx(Text, { color: "#F59E0B", children: "\uFF08\u8BF7\u76F4\u63A5\u8F93\u5165\u6A21\u578B\u540D\u5E76\u56DE\u8F66\uFF0CESC \u53D6\u6D88\uFF09" }), _jsxs(Box, { marginTop: 1, children: [_jsx(Text, { color: "#06B6D4", children: "\u276F " }), _jsx(TextInput, { value: selectedModel, onChange: setSelectedModel, onSubmit: (value) => {
|
|
130
|
+
if (value.trim()) {
|
|
131
|
+
setSelectedModel(value.trim());
|
|
132
|
+
setStep('cache_strategy');
|
|
133
|
+
}
|
|
134
|
+
} })] })] }));
|
|
107
135
|
}
|
|
108
|
-
// v3.0.
|
|
136
|
+
// v3.0.3: prompt-cache strategy step — auto / 5m / 1h / off.
|
|
137
|
+
// The wizard used to require two questions (on/off + 5m/1h). Now it
|
|
138
|
+
// gives the user a single, clear choice up front, with "自动" as the
|
|
139
|
+
// default. The auto path lets the runtime pick the TTL based on the
|
|
140
|
+
// conversation length (see cache/smartModel.ts decideTTL).
|
|
109
141
|
if (step === 'cache_strategy') {
|
|
110
142
|
const items = [
|
|
111
|
-
{ label: '
|
|
143
|
+
{ label: '🤖 自动(推荐:根据会话长度智能选 5m / 1h)', value: 'auto' },
|
|
144
|
+
{ label: '⏱ 强制 5 分钟(短会话,写入便宜)', value: '5m' },
|
|
145
|
+
{ label: '🕐 强制 1 小时(长会话,命中率优先)', value: '1h' },
|
|
112
146
|
{ label: '✗ 关闭(每次请求都重新计算)', value: 'off' },
|
|
113
147
|
];
|
|
114
|
-
return (_jsxs(Box, { flexDirection: "column", paddingLeft: 1, children: [_jsx(Text, { color: "#06B6D4", bold: true, children: "
|
|
115
|
-
if (item.value === '
|
|
116
|
-
setCacheChoice(
|
|
117
|
-
|
|
148
|
+
return (_jsxs(Box, { flexDirection: "column", paddingLeft: 1, children: [_jsx(Text, { color: "#06B6D4", bold: true, children: "Prompt Caching \u7B56\u7565:" }), _jsx(Text, { dimColor: true, children: "\u5BF9 Anthropic / DeepSeek / Gemini \u6709\u6548\u3002" }), _jsx(Text, { dimColor: true, children: "\u81EA\u52A8\u6A21\u5F0F\uFF1A\u77ED\u4F1A\u8BDD\u7528 5m\uFF08\u4FBF\u5B9C\uFF09\uFF0C\u957F\u4F1A\u8BDD\uFF08>15 \u8F6E\uFF09\u81EA\u52A8\u5207 1h\u3002" }), _jsx(SelectInput, { items: items, onSelect: (item) => {
|
|
149
|
+
if (item.value === 'off') {
|
|
150
|
+
setCacheChoice({ enabled: false, ttl: '5m' });
|
|
151
|
+
}
|
|
152
|
+
else if (item.value === 'auto') {
|
|
153
|
+
setCacheChoice({ enabled: true, ttl: '5m' }); // start at 5m, smartModel will upgrade
|
|
118
154
|
}
|
|
119
155
|
else {
|
|
120
|
-
setCacheChoice(
|
|
121
|
-
saveConfig(selectedProvider, selectedModel, apiKey, customUrl || undefined);
|
|
122
|
-
onComplete(selectedProvider, selectedModel, apiKey, customUrl || undefined);
|
|
156
|
+
setCacheChoice({ enabled: true, ttl: item.value });
|
|
123
157
|
}
|
|
124
|
-
} })] }));
|
|
125
|
-
}
|
|
126
|
-
// v3.0.0: TTL choice
|
|
127
|
-
if (step === 'cache_ttl') {
|
|
128
|
-
const items = [
|
|
129
|
-
{ label: '5 分钟(写入成本低,适合短会话)', value: '5m' },
|
|
130
|
-
{ label: '1 小时(写入成本高,适合长会话)', value: '1h' },
|
|
131
|
-
];
|
|
132
|
-
return (_jsxs(Box, { flexDirection: "column", paddingLeft: 1, children: [_jsx(Text, { color: "#06B6D4", bold: true, children: "Cache TTL:" }), _jsx(SelectInput, { items: items, onSelect: (item) => {
|
|
133
|
-
setCacheChoice(c => ({ ...c, ttl: item.value }));
|
|
134
158
|
saveConfig(selectedProvider, selectedModel, apiKey, customUrl || undefined);
|
|
135
159
|
onComplete(selectedProvider, selectedModel, apiKey, customUrl || undefined);
|
|
136
160
|
} })] }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InitWizard.js","sourceRoot":"","sources":["../../../src/tui/components/InitWizard.tsx"],"names":[],"mappings":";AAAA,6BAA6B;AAC7B,OAAc,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"InitWizard.js","sourceRoot":"","sources":["../../../src/tui/components/InitWizard.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCommands.d.ts","sourceRoot":"","sources":["../../../src/tui/hooks/useCommands.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAE9C,UAAU,aAAa;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;CAC7B;
|
|
1
|
+
{"version":3,"file":"useCommands.d.ts","sourceRoot":"","sources":["../../../src/tui/hooks/useCommands.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAE9C,UAAU,aAAa;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;CAC7B;AAmBD,eAAO,MAAM,YAAY;;;GAUxB,CAAC;AAEF,wBAAgB,WAAW,CAAC,GAAG,EAAE,GAAG;2BAEQ,MAAM,KAAG,aAAa;EAwOjE"}
|