thatgfsj-code 1.0.3 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +192 -0
- package/DEVELOPMENT.md +286 -0
- package/dist/app/index.d.ts +40 -3
- package/dist/app/index.d.ts.map +1 -1
- package/dist/app/index.js +87 -12
- package/dist/app/index.js.map +1 -1
- package/dist/cache/fingerprint.d.ts +49 -0
- package/dist/cache/fingerprint.d.ts.map +1 -0
- package/dist/cache/fingerprint.js +100 -0
- package/dist/cache/fingerprint.js.map +1 -0
- package/dist/cache/index.d.ts +15 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +15 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/smartModel.d.ts +40 -0
- package/dist/cache/smartModel.d.ts.map +1 -0
- package/dist/cache/smartModel.js +43 -0
- package/dist/cache/smartModel.js.map +1 -0
- package/dist/cache/stats.d.ts +93 -0
- package/dist/cache/stats.d.ts.map +1 -0
- package/dist/cache/stats.js +155 -0
- package/dist/cache/stats.js.map +1 -0
- package/dist/cache/volatile.d.ts +32 -0
- package/dist/cache/volatile.d.ts.map +1 -0
- package/dist/cache/volatile.js +44 -0
- package/dist/cache/volatile.js.map +1 -0
- package/dist/cmd/index.d.ts +21 -0
- package/dist/cmd/index.d.ts.map +1 -1
- package/dist/cmd/index.js +155 -31
- package/dist/cmd/index.js.map +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +8 -0
- package/dist/config/index.js.map +1 -1
- package/dist/config/types.d.ts +14 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/llm/anthropic.d.ts +55 -5
- package/dist/llm/anthropic.d.ts.map +1 -1
- package/dist/llm/anthropic.js +172 -26
- package/dist/llm/anthropic.js.map +1 -1
- package/dist/llm/index.d.ts +26 -8
- package/dist/llm/index.d.ts.map +1 -1
- package/dist/llm/index.js +83 -15
- package/dist/llm/index.js.map +1 -1
- package/dist/llm/openai.d.ts +28 -8
- package/dist/llm/openai.d.ts.map +1 -1
- package/dist/llm/openai.js +58 -8
- package/dist/llm/openai.js.map +1 -1
- package/dist/llm/provider.d.ts +40 -8
- package/dist/llm/provider.d.ts.map +1 -1
- package/dist/llm/provider.js +8 -1
- package/dist/llm/provider.js.map +1 -1
- package/dist/prompts/index.d.ts +32 -0
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js +33 -11
- package/dist/prompts/index.js.map +1 -1
- package/dist/session/index.d.ts +43 -3
- package/dist/session/index.d.ts.map +1 -1
- package/dist/session/index.js +114 -17
- package/dist/session/index.js.map +1 -1
- package/dist/skills/brainstorming.js +33 -33
- package/dist/skills/code-review.js +35 -35
- package/dist/skills/executing-plans.js +18 -18
- package/dist/skills/frontend-design.js +25 -25
- package/dist/skills/git-workflow.js +26 -26
- package/dist/skills/improve-architecture.js +28 -28
- package/dist/skills/neuroweave.js +37 -37
- package/dist/skills/playwright.js +62 -62
- package/dist/skills/prototype.js +20 -20
- package/dist/skills/subagent.js +19 -19
- package/dist/skills/supabase.js +34 -34
- package/dist/skills/systematic-debugging.js +34 -34
- package/dist/skills/tdd.js +29 -29
- package/dist/skills/triage.js +25 -25
- package/dist/skills/verification.js +22 -22
- package/dist/skills/writing-plans.js +32 -32
- package/dist/tools/nwt.js +16 -16
- package/dist/tui/app.d.ts.map +1 -1
- package/dist/tui/app.js +9 -2
- package/dist/tui/app.js.map +1 -1
- package/dist/tui/components/ChatList.d.ts.map +1 -1
- package/dist/tui/components/ChatList.js +4 -3
- package/dist/tui/components/ChatList.js.map +1 -1
- package/dist/tui/components/Header.d.ts +8 -0
- package/dist/tui/components/Header.d.ts.map +1 -1
- package/dist/tui/components/Header.js +17 -3
- package/dist/tui/components/Header.js.map +1 -1
- package/dist/tui/components/InitWizard.d.ts +12 -1
- package/dist/tui/components/InitWizard.d.ts.map +1 -1
- package/dist/tui/components/InitWizard.js +58 -3
- package/dist/tui/components/InitWizard.js.map +1 -1
- package/dist/tui/components/ToolCall.d.ts +1 -1
- package/dist/tui/components/ToolCall.d.ts.map +1 -1
- package/dist/tui/components/ToolCall.js +4 -4
- package/dist/tui/components/ToolCall.js.map +1 -1
- package/dist/tui/hooks/useChat.d.ts +22 -0
- package/dist/tui/hooks/useChat.d.ts.map +1 -1
- package/dist/tui/hooks/useChat.js +127 -50
- package/dist/tui/hooks/useChat.js.map +1 -1
- package/dist/tui/hooks/useCommands.d.ts.map +1 -1
- package/dist/tui/hooks/useCommands.js +78 -0
- package/dist/tui/hooks/useCommands.js.map +1 -1
- package/dist/types.d.ts +79 -6
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -1
- package/dist/utils/stableStringify.d.ts +21 -0
- package/dist/utils/stableStringify.d.ts.map +1 -0
- package/dist/utils/stableStringify.js +53 -0
- package/dist/utils/stableStringify.js.map +1 -0
- package/dist/utils/thinking.d.ts +59 -0
- package/dist/utils/thinking.d.ts.map +1 -0
- package/dist/utils/thinking.js +104 -0
- package/dist/utils/thinking.js.map +1 -0
- package/install.bat +63 -0
- package/install.ps1 +238 -0
- package/install.sh +113 -0
- package/package.json +7 -4
- package/src/app/index.ts +180 -108
- package/src/cache/fingerprint.ts +101 -0
- package/src/cache/index.ts +15 -0
- package/src/cache/smartModel.ts +52 -0
- package/src/cache/stats.ts +199 -0
- package/src/cache/volatile.ts +47 -0
- package/src/cmd/index.tsx +288 -160
- package/src/config/index.ts +156 -148
- package/src/config/providers.ts +234 -234
- package/src/config/types.ts +67 -53
- package/src/hooks/index.ts +111 -111
- package/src/llm/anthropic.ts +388 -243
- package/src/llm/gemini.ts +169 -169
- package/src/llm/index.ts +265 -200
- package/src/llm/openai.ts +243 -196
- package/src/llm/provider.ts +66 -34
- package/src/prompts/index.ts +260 -220
- package/src/session/compactor.ts +103 -103
- package/src/session/index.ts +181 -87
- package/src/session/message.ts +42 -42
- package/src/skills/brainstorming.ts +43 -43
- package/src/skills/code-review.ts +45 -45
- package/src/skills/executing-plans.ts +27 -27
- package/src/skills/frontend-design.ts +35 -35
- package/src/skills/git-workflow.ts +36 -36
- package/src/skills/improve-architecture.ts +38 -38
- package/src/skills/index.ts +136 -136
- package/src/skills/neuroweave.ts +47 -47
- package/src/skills/playwright.ts +72 -72
- package/src/skills/prototype.ts +30 -30
- package/src/skills/subagent.ts +28 -28
- package/src/skills/supabase.ts +44 -44
- package/src/skills/systematic-debugging.ts +44 -44
- package/src/skills/tdd.ts +39 -39
- package/src/skills/triage.ts +35 -35
- package/src/skills/verification.ts +31 -31
- package/src/skills/writing-plans.ts +42 -42
- package/src/tools/nwt.ts +598 -598
- package/src/tools/types.ts +122 -122
- package/src/tui/app.tsx +199 -186
- package/src/tui/components/ChatList.tsx +41 -32
- package/src/tui/components/ChatMessage.tsx +54 -54
- package/src/tui/components/Header.tsx +56 -28
- package/src/tui/components/InitWizard.tsx +217 -132
- package/src/tui/components/Markdown.tsx +35 -35
- package/src/tui/components/ModelSelector.tsx +87 -87
- package/src/tui/components/StatusBar.tsx +30 -30
- package/src/tui/components/Thinking.tsx +17 -17
- package/src/tui/components/ToolCall.tsx +102 -71
- package/src/tui/components/UserInput.tsx +131 -131
- package/src/tui/hooks/useChat.ts +287 -194
- package/src/tui/hooks/useCommands.ts +234 -154
- package/src/tui/index.ts +6 -6
- package/src/tui/welcome.ts +177 -177
- package/src/types.ts +104 -42
- package/src/utils/diff.ts +71 -71
- package/src/utils/project.ts +99 -99
- package/src/utils/stableStringify.ts +47 -0
- package/src/utils/thinking.ts +119 -0
- package/tests/cache/fingerprint.test.ts +75 -0
- package/tests/cache/stableStringify.test.ts +43 -0
- package/tests/cache/stats.test.ts +146 -0
- package/tests/cache/volatile.test.ts +75 -0
- package/tests/smoke-pollution.mjs +78 -0
- package/tests/smoke-thinking.mjs +110 -0
- package/tests/smoke-tool-stream.mjs +69 -0
- package/tests/smoke-tool.mjs +117 -0
|
@@ -1,4 +1,20 @@
|
|
|
1
1
|
import { useState, useCallback, useRef } from 'react';
|
|
2
|
+
import { compressThinking, splitThinking, summarizeThinking } from '../../utils/thinking.js';
|
|
3
|
+
/**
|
|
4
|
+
* Hook for managing chat state and the streaming response lifecycle.
|
|
5
|
+
*
|
|
6
|
+
* v3.0.0: streamResponse yields structured StreamChunks (text / tool_calls /
|
|
7
|
+
* thinking / usage). The previous @@TOOL@@ sentinel-string parsing is gone.
|
|
8
|
+
*
|
|
9
|
+
* Persisted message order matches the source chunks exactly:
|
|
10
|
+
* - text chunks → accumulated into fullContent (later compressed via
|
|
11
|
+
* compressThinking before persistence)
|
|
12
|
+
* - tool_calls chunks → results are summarized into a `[tool: name → result]`
|
|
13
|
+
* suffix on the assistant message (same belt-and-suspenders behavior as
|
|
14
|
+
* v2.2.6)
|
|
15
|
+
* - usage chunks → surfaced via state.lastUsage so the TUI Header can render
|
|
16
|
+
* cache hit-rate (consumed by app.tsx via /cache command in M3)
|
|
17
|
+
*/
|
|
2
18
|
export function useChat(app) {
|
|
3
19
|
const [state, setState] = useState({
|
|
4
20
|
messages: [],
|
|
@@ -6,6 +22,7 @@ export function useChat(app) {
|
|
|
6
22
|
streaming: '',
|
|
7
23
|
streamingToolCalls: [],
|
|
8
24
|
queuedMessage: null,
|
|
25
|
+
lastUsage: null,
|
|
9
26
|
});
|
|
10
27
|
const processingRef = useRef(false);
|
|
11
28
|
const queuedRef = useRef(null);
|
|
@@ -24,75 +41,134 @@ export function useChat(app) {
|
|
|
24
41
|
const stream = app.streamResponse();
|
|
25
42
|
let fullContent = '';
|
|
26
43
|
let currentToolCalls = [];
|
|
44
|
+
// Latest usage from this round; surfaced via state.lastUsage.
|
|
45
|
+
let lastUsage = null;
|
|
27
46
|
let lastUpdateTime = 0;
|
|
28
47
|
const THROTTLE_MS = 50;
|
|
48
|
+
/**
|
|
49
|
+
* Flush streaming state to React. Throttled to ~20fps so the terminal
|
|
50
|
+
* doesn't flicker on long completions (combined with <Static> below the
|
|
51
|
+
* completion line stays put while the streaming line updates in place).
|
|
52
|
+
*/
|
|
53
|
+
const flushStreaming = () => {
|
|
54
|
+
const now = Date.now();
|
|
55
|
+
if (now - lastUpdateTime < THROTTLE_MS)
|
|
56
|
+
return;
|
|
57
|
+
lastUpdateTime = now;
|
|
58
|
+
setState(prev => ({ ...prev, isThinking: false, streaming: fullContent }));
|
|
59
|
+
};
|
|
29
60
|
try {
|
|
30
61
|
for await (const chunk of stream) {
|
|
31
62
|
// Check abort
|
|
32
63
|
if (abortRef.current) {
|
|
33
64
|
break;
|
|
34
65
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
const data = JSON.parse(part.slice(8));
|
|
41
|
-
if (data.action === 'call') {
|
|
42
|
-
currentToolCalls.push({ name: data.name, args: data.args || '' });
|
|
43
|
-
setState(prev => ({
|
|
44
|
-
...prev,
|
|
45
|
-
isThinking: false,
|
|
46
|
-
streamingToolCalls: [...currentToolCalls],
|
|
47
|
-
}));
|
|
48
|
-
}
|
|
49
|
-
else if (data.action === 'result') {
|
|
50
|
-
const lastIdx = currentToolCalls.length - 1;
|
|
51
|
-
if (lastIdx >= 0) {
|
|
52
|
-
currentToolCalls[lastIdx] = {
|
|
53
|
-
...currentToolCalls[lastIdx],
|
|
54
|
-
result: data.output || data.error || '',
|
|
55
|
-
isError: !!data.error,
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
setState(prev => ({
|
|
59
|
-
...prev,
|
|
60
|
-
streamingToolCalls: [...currentToolCalls],
|
|
61
|
-
isThinking: true,
|
|
62
|
-
}));
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
catch {
|
|
66
|
-
fullContent += part;
|
|
67
|
-
}
|
|
66
|
+
switch (chunk.type) {
|
|
67
|
+
case 'text':
|
|
68
|
+
if (chunk.content) {
|
|
69
|
+
fullContent += chunk.content;
|
|
70
|
+
flushStreaming();
|
|
68
71
|
}
|
|
69
|
-
|
|
70
|
-
|
|
72
|
+
break;
|
|
73
|
+
case 'thinking':
|
|
74
|
+
// Reasoning text. We do not append it to fullContent (it is
|
|
75
|
+
// stripped from persistence in compressThinking), but we surface
|
|
76
|
+
// it via the streaming display when app.showThinking is on.
|
|
77
|
+
if (app.showThinking && chunk.content) {
|
|
78
|
+
fullContent += chunk.content;
|
|
79
|
+
flushStreaming();
|
|
71
80
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
+
break;
|
|
82
|
+
case 'tool_calls':
|
|
83
|
+
if (chunk.toolCalls && chunk.toolCalls.length > 0) {
|
|
84
|
+
// Replace rather than append — LLMService emits one combined
|
|
85
|
+
// tool_calls chunk per iteration. This is the dispatch plan.
|
|
86
|
+
currentToolCalls = chunk.toolCalls.map(tc => ({
|
|
87
|
+
name: tc.function.name,
|
|
88
|
+
args: tc.function.arguments,
|
|
89
|
+
// Results are appended by the *next* text chunk via the
|
|
90
|
+
// `[tool: name → result]` suffix we add on persistence. The
|
|
91
|
+
// streaming ToolCall panel below renders a "running" state
|
|
92
|
+
// until the next iteration's tool_calls chunk comes back
|
|
93
|
+
// with `result` (we look up by name).
|
|
94
|
+
result: undefined,
|
|
95
|
+
isError: false,
|
|
96
|
+
}));
|
|
97
|
+
setState(prev => ({
|
|
98
|
+
...prev,
|
|
99
|
+
isThinking: false,
|
|
100
|
+
streamingToolCalls: [...currentToolCalls],
|
|
101
|
+
}));
|
|
102
|
+
}
|
|
103
|
+
break;
|
|
104
|
+
case 'usage':
|
|
105
|
+
lastUsage = chunk.usage;
|
|
106
|
+
setState(prev => ({ ...prev, lastUsage: chunk.usage }));
|
|
107
|
+
break;
|
|
81
108
|
}
|
|
82
109
|
}
|
|
83
|
-
//
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
110
|
+
// v2.2.4 (port from v2.1.0): DO NOT persist truncated assistant
|
|
111
|
+
// messages. The previous code literally wrote `'\n\n[已中断]'`
|
|
112
|
+
// as a suffix and persisted it — which is what created the
|
|
113
|
+
// hallucination loop where the next turn's LLM echoed the
|
|
114
|
+
// marker back. The fix is two-pronged:
|
|
115
|
+
// 1. Never persist when the stream was aborted (here).
|
|
116
|
+
// 2. SessionManager.addMessageSafe drops messages that match
|
|
117
|
+
// the pollution filter as a belt-and-suspenders check
|
|
118
|
+
// for cases where we somehow persist a polluted message.
|
|
119
|
+
const wasAborted = abortRef.current;
|
|
120
|
+
const shouldPersist = !wasAborted &&
|
|
121
|
+
(fullContent.trim() || currentToolCalls.length > 0);
|
|
122
|
+
if (shouldPersist) {
|
|
123
|
+
// v2.2.5: strip blocks from the persisted message
|
|
124
|
+
// when compression is enabled. Same rationale as in
|
|
125
|
+
// cmd/index.tsx — keeps history compact, avoids re-feeding
|
|
126
|
+
// reasoning into the next turn's context window.
|
|
127
|
+
const toPersist = compressThinking(fullContent, app.showThinking);
|
|
128
|
+
app.session.addMessageSafe('assistant', toPersist);
|
|
87
129
|
}
|
|
130
|
+
// v2.2.5: build a displayable version. When thinking is hidden
|
|
131
|
+
// we still want the user to see a one-line indicator of how
|
|
132
|
+
// much reasoning the model did, plus the conclusion.
|
|
133
|
+
const split = splitThinking(fullContent);
|
|
134
|
+
const displayContent = app.showThinking
|
|
135
|
+
? fullContent
|
|
136
|
+
: (split.thinking
|
|
137
|
+
? `${summarizeThinking(split)}\n${split.conclusion}`
|
|
138
|
+
: fullContent);
|
|
139
|
+
// v2.2.6 (tool-result belt-and-suspenders): if any tool call
|
|
140
|
+
// returned text, also append a compact "[tool: name → result]"
|
|
141
|
+
// summary to the persisted/displayed content. This guarantees
|
|
142
|
+
// the user sees the tool output regardless of whether the Ink
|
|
143
|
+
// <ToolCall/> component renders it correctly. Past sessions
|
|
144
|
+
// have had cases where the streaming ToolCall rendering failed
|
|
145
|
+
// silently (e.g. result was empty string, wrap=truncate cut
|
|
146
|
+
// long output off-screen) and the user had no idea what the
|
|
147
|
+
// tool actually returned.
|
|
148
|
+
//
|
|
149
|
+
// v3.0.0: since LLMService now folds tool results into
|
|
150
|
+
// currentMessages without surfacing them as separate chunks, we no
|
|
151
|
+
// longer have a `result` field on each ToolCallData here. The
|
|
152
|
+
// result summary is built by reading back from
|
|
153
|
+
// app.session.getMessages() — the latest `tool` role message per
|
|
154
|
+
// tool call id. To keep this lightweight we fall back to a brief
|
|
155
|
+
// "[tool: name → see message]" suffix when the result is not
|
|
156
|
+
// available in our local streaming state.
|
|
157
|
+
const toolSummary = currentToolCalls.length > 0
|
|
158
|
+
? '\n\n' + currentToolCalls.map((tc) => {
|
|
159
|
+
const r = tc.result !== undefined ? tc.result : '(see tool result above)';
|
|
160
|
+
const short = r.length > 200 ? r.slice(0, 197) + '...' : r;
|
|
161
|
+
return `[tool: ${tc.name} → ${short}]`;
|
|
162
|
+
}).join('\n')
|
|
163
|
+
: '';
|
|
88
164
|
setState(prev => ({
|
|
89
165
|
...prev,
|
|
90
166
|
messages: [
|
|
91
167
|
...prev.messages,
|
|
92
|
-
...(
|
|
168
|
+
...(shouldPersist
|
|
93
169
|
? [{
|
|
94
170
|
role: 'assistant',
|
|
95
|
-
content:
|
|
171
|
+
content: displayContent + toolSummary,
|
|
96
172
|
toolCalls: currentToolCalls.length > 0 ? currentToolCalls : undefined,
|
|
97
173
|
}]
|
|
98
174
|
: []),
|
|
@@ -100,6 +176,7 @@ export function useChat(app) {
|
|
|
100
176
|
streaming: '',
|
|
101
177
|
streamingToolCalls: [],
|
|
102
178
|
isThinking: false,
|
|
179
|
+
lastUsage,
|
|
103
180
|
}));
|
|
104
181
|
app.session.truncate();
|
|
105
182
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useChat.js","sourceRoot":"","sources":["../../../src/tui/hooks/useChat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"useChat.js","sourceRoot":"","sources":["../../../src/tui/hooks/useChat.ts"],"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;AAiBD,eAAO,MAAM,YAAY;;;GASxB,CAAC;AAEF,wBAAgB,WAAW,CAAC,GAAG,EAAE,GAAG;2BAEQ,MAAM,KAAG,aAAa;EAoMjE"}
|
|
@@ -10,12 +10,15 @@ const CMD_ALIASES = {
|
|
|
10
10
|
'/mcp': '/mcp',
|
|
11
11
|
'/帮助': '/help',
|
|
12
12
|
'/服务商': '/provider',
|
|
13
|
+
'/思考': '/thinking',
|
|
14
|
+
'/缓存': '/cache',
|
|
13
15
|
};
|
|
14
16
|
export const COMMAND_LIST = [
|
|
15
17
|
{ name: '/模型', desc: '切换模型' },
|
|
16
18
|
{ name: '/服务商', desc: '更换服务商' },
|
|
17
19
|
{ name: '/新建', desc: '新建会话' },
|
|
18
20
|
{ name: '/压缩', desc: '压缩上下文' },
|
|
21
|
+
{ name: '/缓存', desc: '缓存命中率' },
|
|
19
22
|
{ name: '/技能', desc: '管理技能' },
|
|
20
23
|
{ name: '/mcp', desc: 'MCP 设置' },
|
|
21
24
|
{ name: '/帮助', desc: '查看帮助' },
|
|
@@ -67,6 +70,60 @@ export function useCommands(app) {
|
|
|
67
70
|
const after = app.session.getMessageCount();
|
|
68
71
|
return { handled: true, output: `上下文已压缩: ${before} → ${after} 条消息` };
|
|
69
72
|
}
|
|
73
|
+
// ── /cache — prompt cache hit-rate + cost savings ───
|
|
74
|
+
// v3.0.0: surfaces CacheStatsStore snapshots. Sub-commands:
|
|
75
|
+
// /cache show full breakdown
|
|
76
|
+
// /cache reset zero the persistent stats
|
|
77
|
+
if (name === '/cache') {
|
|
78
|
+
if (arg === 'reset' || arg === '重置') {
|
|
79
|
+
app.cacheStats.reset();
|
|
80
|
+
return { handled: true, output: '✓ 缓存统计已重置' };
|
|
81
|
+
}
|
|
82
|
+
if (arg === 'off' || arg === '关') {
|
|
83
|
+
// Toggle disable: writes through to provider config (currently a
|
|
84
|
+
// no-op until M4.5 wires Config.cache). Print a hint.
|
|
85
|
+
return {
|
|
86
|
+
handled: true,
|
|
87
|
+
output: [
|
|
88
|
+
'✗ 关闭缓存功能:在 ~/.thatgfsj/config.json 添加 "cache": { "enabled": false } 后重启。',
|
|
89
|
+
' (提示:完全关闭会大幅增加 token 成本;推荐保留开启)',
|
|
90
|
+
].join('\n'),
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
const s = app.cacheStats.snapshot();
|
|
94
|
+
if (s.totalRequests === 0) {
|
|
95
|
+
return {
|
|
96
|
+
handled: true,
|
|
97
|
+
output: [
|
|
98
|
+
'⚡ 缓存统计',
|
|
99
|
+
'─────────────────────────',
|
|
100
|
+
' 暂无请求。开启一段对话后再来查看。',
|
|
101
|
+
'',
|
|
102
|
+
'/cache reset · 重置统计',
|
|
103
|
+
].join('\n'),
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
const hitRateStr = (s.hitRate * 100).toFixed(1) + '%';
|
|
107
|
+
const recent = s.history.slice(-10);
|
|
108
|
+
const lines = [
|
|
109
|
+
'⚡ 缓存统计 (累计 ' + s.totalRequests + ' 轮)',
|
|
110
|
+
'─────────────────────────',
|
|
111
|
+
` 命中率: ${hitRateStr} (${s.totalReadTokens.toLocaleString()} / ${s.totalInputTokens.toLocaleString()} tokens)`,
|
|
112
|
+
` 累计创建: ${s.totalCreationTokens.toLocaleString()} tokens`,
|
|
113
|
+
` 累计节省: ¥${s.estimatedSavingsCNY.toFixed(4)}`,
|
|
114
|
+
'',
|
|
115
|
+
'最近 10 轮:',
|
|
116
|
+
];
|
|
117
|
+
for (let i = 0; i < recent.length; i++) {
|
|
118
|
+
const r = recent[i];
|
|
119
|
+
const tag = r.read > 0 ? '⚡' : '💸';
|
|
120
|
+
const pct = (r.hitRate * 100).toFixed(0) + '%';
|
|
121
|
+
lines.push(` #${s.history.length - recent.length + i + 1} [${tag}] ${String(r.read).padStart(5)} / ${String(r.input).padStart(5)} ${pct.padStart(4)}`);
|
|
122
|
+
}
|
|
123
|
+
lines.push('');
|
|
124
|
+
lines.push('/cache reset · 重置统计');
|
|
125
|
+
return { handled: true, output: lines.join('\n') };
|
|
126
|
+
}
|
|
70
127
|
// ── /skills [id] ────────────────────────────────────
|
|
71
128
|
if (name === '/skills') {
|
|
72
129
|
if (arg) {
|
|
@@ -106,6 +163,25 @@ export function useCommands(app) {
|
|
|
106
163
|
].join('\n'),
|
|
107
164
|
};
|
|
108
165
|
}
|
|
166
|
+
// ── /thinking on|off ─────────────────────────────────
|
|
167
|
+
if (name === '/thinking' || name === '/思考') {
|
|
168
|
+
if (!arg) {
|
|
169
|
+
return {
|
|
170
|
+
handled: true,
|
|
171
|
+
output: `思考块显示: ${app.showThinking ? '开启 (显示完整 <think>...</think>)' : '关闭 (压缩为单行提示)'}`,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
const want = arg.toLowerCase();
|
|
175
|
+
if (want === 'on' || want === '开启' || want === 'true' || want === '1') {
|
|
176
|
+
app.showThinking = true;
|
|
177
|
+
return { handled: true, output: '✓ 已开启完整思考块显示' };
|
|
178
|
+
}
|
|
179
|
+
if (want === 'off' || want === '关闭' || want === 'false' || want === '0') {
|
|
180
|
+
app.showThinking = false;
|
|
181
|
+
return { handled: true, output: '✓ 已关闭思考块显示 (压缩为单行提示)' };
|
|
182
|
+
}
|
|
183
|
+
return { handled: true, output: `用法: /thinking on|off (当前: ${app.showThinking ? 'on' : 'off'})` };
|
|
184
|
+
}
|
|
109
185
|
// ── /help ───────────────────────────────────────────
|
|
110
186
|
if (name === '/help') {
|
|
111
187
|
return {
|
|
@@ -116,6 +192,8 @@ export function useCommands(app) {
|
|
|
116
192
|
' /服务商 更换服务商',
|
|
117
193
|
' /新建 新建会话',
|
|
118
194
|
' /压缩 压缩上下文',
|
|
195
|
+
' /缓存 查看缓存命中率',
|
|
196
|
+
' /思考 [on|off] 切换思考块显示',
|
|
119
197
|
' /技能 [id] 管理技能',
|
|
120
198
|
' /mcp MCP 设置',
|
|
121
199
|
' /帮助 查看帮助',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCommands.js","sourceRoot":"","sources":["../../../src/tui/hooks/useCommands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AASpC,WAAW;AACX,MAAM,WAAW,GAA2B;IAC1C,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,MAAM;IACb,KAAK,EAAE,MAAM;IACb,KAAK,EAAE,UAAU;IACjB,KAAK,EAAE,SAAS;IAChB,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,MAAM;IACd,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,WAAW;
|
|
1
|
+
{"version":3,"file":"useCommands.js","sourceRoot":"","sources":["../../../src/tui/hooks/useCommands.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,15 +1,59 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Global shared types for Thatgfsj Code
|
|
3
3
|
* Only the most fundamental types used across modules
|
|
4
|
+
*
|
|
5
|
+
* v3.0.0+: Extended for Reasonix-style prompt caching:
|
|
6
|
+
* - ChatMessage.content now accepts ContentBlock[] (Anthropic-style)
|
|
7
|
+
* - cache_control field for explicit Anthropic cache breakpoints
|
|
8
|
+
* - usage extended with cache_creation_input_tokens / cache_read_input_tokens
|
|
9
|
+
* (Anthropic) and prompt_cache_hit_tokens / prompt_cache_miss_tokens (DeepSeek)
|
|
10
|
+
* - StreamChunk now has 'thinking' / 'usage' variants for structured streaming
|
|
4
11
|
*/
|
|
5
12
|
export type Role = 'system' | 'user' | 'assistant' | 'tool';
|
|
13
|
+
/**
|
|
14
|
+
* Anthropic-style cache control. ttl: '5m' (default) | '1h'
|
|
15
|
+
* - '5m': cheaper write cost, refreshed on each hit, expires 5 min after last hit
|
|
16
|
+
* - '1h': more expensive write cost, expires 1 hour after last hit
|
|
17
|
+
*/
|
|
18
|
+
export interface CacheControl {
|
|
19
|
+
type: 'ephemeral';
|
|
20
|
+
ttl?: '5m' | '1h';
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Anthropic-style content blocks. text carries optional cache_control so that
|
|
24
|
+
* Anthropic prompt caching breakpoints can be placed inside messages.
|
|
25
|
+
*/
|
|
26
|
+
export type ContentBlock = {
|
|
27
|
+
type: 'text';
|
|
28
|
+
text: string;
|
|
29
|
+
cache_control?: CacheControl;
|
|
30
|
+
} | {
|
|
31
|
+
type: 'image';
|
|
32
|
+
source: {
|
|
33
|
+
type: 'base64';
|
|
34
|
+
media_type: string;
|
|
35
|
+
data: string;
|
|
36
|
+
};
|
|
37
|
+
};
|
|
6
38
|
export interface ChatMessage {
|
|
7
39
|
role: Role;
|
|
8
|
-
|
|
40
|
+
/**
|
|
41
|
+
* For 'system' / 'user' / 'assistant' (text only): a plain string.
|
|
42
|
+
* For 'user' (multimodal) or 'assistant' (Anthropic tool_use mixed with text):
|
|
43
|
+
* an array of ContentBlock.
|
|
44
|
+
* 'tool' messages must use string content (carries tool result text).
|
|
45
|
+
*/
|
|
46
|
+
content: string | ContentBlock[];
|
|
9
47
|
name?: string;
|
|
10
48
|
tool_calls?: ToolCall[];
|
|
11
49
|
tool_call_id?: string;
|
|
12
50
|
reasoning_content?: string;
|
|
51
|
+
/**
|
|
52
|
+
* Anthropic prompt caching marker attached to the message itself.
|
|
53
|
+
* Only honored when the underlying provider supports it (anthropic, anthropic-relay).
|
|
54
|
+
* OpenAI / Gemini / DeepSeek ignore it (DeepSeek uses automatic prefix cache).
|
|
55
|
+
*/
|
|
56
|
+
cache_control?: CacheControl;
|
|
13
57
|
}
|
|
14
58
|
export interface ToolCall {
|
|
15
59
|
id: string;
|
|
@@ -19,14 +63,19 @@ export interface ToolCall {
|
|
|
19
63
|
arguments: string;
|
|
20
64
|
};
|
|
21
65
|
}
|
|
66
|
+
export interface Usage {
|
|
67
|
+
prompt_tokens: number;
|
|
68
|
+
completion_tokens: number;
|
|
69
|
+
total_tokens: number;
|
|
70
|
+
cache_creation_input_tokens?: number;
|
|
71
|
+
cache_read_input_tokens?: number;
|
|
72
|
+
prompt_cache_hit_tokens?: number;
|
|
73
|
+
prompt_cache_miss_tokens?: number;
|
|
74
|
+
}
|
|
22
75
|
export interface ChatResponse {
|
|
23
76
|
content: string;
|
|
24
77
|
role: 'assistant';
|
|
25
|
-
usage?:
|
|
26
|
-
prompt_tokens: number;
|
|
27
|
-
completion_tokens: number;
|
|
28
|
-
total_tokens: number;
|
|
29
|
-
};
|
|
78
|
+
usage?: Usage;
|
|
30
79
|
tool_calls?: ToolCall[];
|
|
31
80
|
reasoning_content?: string;
|
|
32
81
|
}
|
|
@@ -35,4 +84,28 @@ export interface ChatOptions {
|
|
|
35
84
|
maxTokens?: number;
|
|
36
85
|
stream?: boolean;
|
|
37
86
|
}
|
|
87
|
+
/**
|
|
88
|
+
* Structured streaming chunk. Replaces the legacy @@TOOL@@ sentinel-string
|
|
89
|
+
* protocol that the previous version of useChat parsed by string-splitting.
|
|
90
|
+
*
|
|
91
|
+
* - 'text': regular model output
|
|
92
|
+
* - 'tool_calls': one or more tool calls ready to dispatch
|
|
93
|
+
* - 'thinking': reasoning content (stripped from final persistence; kept in
|
|
94
|
+
* VolatileScratch for the current round only)
|
|
95
|
+
* - 'usage': token usage + cache stats; emitted at end of stream if
|
|
96
|
+
* the upstream provider returned them
|
|
97
|
+
*/
|
|
98
|
+
export type StreamChunk = {
|
|
99
|
+
type: 'text';
|
|
100
|
+
content: string;
|
|
101
|
+
} | {
|
|
102
|
+
type: 'tool_calls';
|
|
103
|
+
toolCalls: ToolCall[];
|
|
104
|
+
} | {
|
|
105
|
+
type: 'thinking';
|
|
106
|
+
content: string;
|
|
107
|
+
} | {
|
|
108
|
+
type: 'usage';
|
|
109
|
+
usage: Usage;
|
|
110
|
+
};
|
|
38
111
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,MAAM,IAAI,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;AAE5D;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,WAAW,CAAC;IAClB,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,YAAY,CAAA;CAAE,GAC5D;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE;QAAE,IAAI,EAAE,QAAQ,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC;AAEpF,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,IAAI,CAAC;IACX;;;;;OAKG;IACH,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;OAIG;IACH,aAAa,CAAC,EAAE,YAAY,CAAC;CAC9B;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,KAAK;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IAErB,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAEjC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,wBAAwB,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;;;GAUG;AACH,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,SAAS,EAAE,QAAQ,EAAE,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,CAAC"}
|
package/dist/types.js
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Global shared types for Thatgfsj Code
|
|
3
3
|
* Only the most fundamental types used across modules
|
|
4
|
+
*
|
|
5
|
+
* v3.0.0+: Extended for Reasonix-style prompt caching:
|
|
6
|
+
* - ChatMessage.content now accepts ContentBlock[] (Anthropic-style)
|
|
7
|
+
* - cache_control field for explicit Anthropic cache breakpoints
|
|
8
|
+
* - usage extended with cache_creation_input_tokens / cache_read_input_tokens
|
|
9
|
+
* (Anthropic) and prompt_cache_hit_tokens / prompt_cache_miss_tokens (DeepSeek)
|
|
10
|
+
* - StreamChunk now has 'thinking' / 'usage' variants for structured streaming
|
|
4
11
|
*/
|
|
5
12
|
export {};
|
|
6
13
|
//# sourceMappingURL=types.js.map
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic JSON serializer.
|
|
3
|
+
*
|
|
4
|
+
* JSON.stringify in V8 iterates keys in insertion order, which means objects
|
|
5
|
+
* built with literal `{a, b, c}` are stable, but anything built via spread,
|
|
6
|
+
* Object.fromEntries, or merged maps can produce different byte sequences
|
|
7
|
+
* between requests. That byte-sequence instability is fatal for prompt-cache
|
|
8
|
+
* hit-rate: a single reordered key invalidates the cache fingerprint.
|
|
9
|
+
*
|
|
10
|
+
* stableStringify sorts object keys lexicographically before recursing, so
|
|
11
|
+
* any pair of structurally equal objects produces identical JSON text.
|
|
12
|
+
*
|
|
13
|
+
* Performance note: O(n log n) on key counts per object. For typical request
|
|
14
|
+
* bodies (<200 KB) the overhead is negligible (<5 ms). The main hot path is
|
|
15
|
+
* the tool/parameters tree which is small and stable in practice.
|
|
16
|
+
*
|
|
17
|
+
* Reference: Reasonix-style "stableStringify" requirement for prefix-cache
|
|
18
|
+
* byte-level stability (see DeepSeek Reasonix, Section 3).
|
|
19
|
+
*/
|
|
20
|
+
export declare function stableStringify(value: unknown): string;
|
|
21
|
+
//# sourceMappingURL=stableStringify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stableStringify.d.ts","sourceRoot":"","sources":["../../src/utils/stableStringify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEtD"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic JSON serializer.
|
|
3
|
+
*
|
|
4
|
+
* JSON.stringify in V8 iterates keys in insertion order, which means objects
|
|
5
|
+
* built with literal `{a, b, c}` are stable, but anything built via spread,
|
|
6
|
+
* Object.fromEntries, or merged maps can produce different byte sequences
|
|
7
|
+
* between requests. That byte-sequence instability is fatal for prompt-cache
|
|
8
|
+
* hit-rate: a single reordered key invalidates the cache fingerprint.
|
|
9
|
+
*
|
|
10
|
+
* stableStringify sorts object keys lexicographically before recursing, so
|
|
11
|
+
* any pair of structurally equal objects produces identical JSON text.
|
|
12
|
+
*
|
|
13
|
+
* Performance note: O(n log n) on key counts per object. For typical request
|
|
14
|
+
* bodies (<200 KB) the overhead is negligible (<5 ms). The main hot path is
|
|
15
|
+
* the tool/parameters tree which is small and stable in practice.
|
|
16
|
+
*
|
|
17
|
+
* Reference: Reasonix-style "stableStringify" requirement for prefix-cache
|
|
18
|
+
* byte-level stability (see DeepSeek Reasonix, Section 3).
|
|
19
|
+
*/
|
|
20
|
+
export function stableStringify(value) {
|
|
21
|
+
return stringify(value);
|
|
22
|
+
}
|
|
23
|
+
function stringify(value) {
|
|
24
|
+
if (value === null)
|
|
25
|
+
return 'null';
|
|
26
|
+
if (value === undefined)
|
|
27
|
+
return 'null'; // OpenAI wire format does not carry undefined
|
|
28
|
+
const t = typeof value;
|
|
29
|
+
if (t === 'string')
|
|
30
|
+
return JSON.stringify(value);
|
|
31
|
+
if (t === 'number')
|
|
32
|
+
return Number.isFinite(value) ? String(value) : 'null';
|
|
33
|
+
if (t === 'boolean')
|
|
34
|
+
return value ? 'true' : 'false';
|
|
35
|
+
if (Array.isArray(value)) {
|
|
36
|
+
return '[' + value.map((v) => stringify(v)).join(',') + ']';
|
|
37
|
+
}
|
|
38
|
+
if (t === 'object') {
|
|
39
|
+
const obj = value;
|
|
40
|
+
const keys = Object.keys(obj).sort();
|
|
41
|
+
const parts = [];
|
|
42
|
+
for (const k of keys) {
|
|
43
|
+
const v = obj[k];
|
|
44
|
+
if (v === undefined)
|
|
45
|
+
continue; // omit undefined to match OpenAI/Anthropic convention
|
|
46
|
+
parts.push(JSON.stringify(k) + ':' + stringify(v));
|
|
47
|
+
}
|
|
48
|
+
return '{' + parts.join(',') + '}';
|
|
49
|
+
}
|
|
50
|
+
// functions / symbols / bigints: drop
|
|
51
|
+
return 'null';
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=stableStringify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stableStringify.js","sourceRoot":"","sources":["../../src/utils/stableStringify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAClC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,CAAC,8CAA8C;IACtF,MAAM,CAAC,GAAG,OAAO,KAAK,CAAC;IACvB,IAAI,CAAC,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACjD,IAAI,CAAC,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAe,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACrF,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IACrD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IAC9D,CAAC;IACD,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,KAAgC,CAAC;QAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACrC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YACjB,IAAI,CAAC,KAAK,SAAS;gBAAE,SAAS,CAAC,sDAAsD;YACrF,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IACrC,CAAC;IACD,sCAAsC;IACtC,OAAO,MAAM,CAAC;AAChB,CAAC"}
|