@serjm/deepseek-code 0.3.1
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/CONTRIBUTING.md +73 -0
- package/README.md +194 -0
- package/README.ru.md +194 -0
- package/dist/api/index.d.ts +77 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +263 -0
- package/dist/api/index.js.map +1 -0
- package/dist/cli/headless.d.ts +22 -0
- package/dist/cli/headless.d.ts.map +1 -0
- package/dist/cli/headless.js +122 -0
- package/dist/cli/headless.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +90 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/interactive.d.ts +18 -0
- package/dist/cli/interactive.d.ts.map +1 -0
- package/dist/cli/interactive.js +75 -0
- package/dist/cli/interactive.js.map +1 -0
- package/dist/commands/index.d.ts +30 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +964 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/config/defaults.d.ts +37 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +39 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/loader.d.ts +4 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +76 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/core/agent-loop.d.ts +111 -0
- package/dist/core/agent-loop.d.ts.map +1 -0
- package/dist/core/agent-loop.js +485 -0
- package/dist/core/agent-loop.js.map +1 -0
- package/dist/core/checkpoint.d.ts +10 -0
- package/dist/core/checkpoint.d.ts.map +1 -0
- package/dist/core/checkpoint.js +83 -0
- package/dist/core/checkpoint.js.map +1 -0
- package/dist/core/extensions.d.ts +55 -0
- package/dist/core/extensions.d.ts.map +1 -0
- package/dist/core/extensions.js +113 -0
- package/dist/core/extensions.js.map +1 -0
- package/dist/core/git.d.ts +68 -0
- package/dist/core/git.d.ts.map +1 -0
- package/dist/core/git.js +148 -0
- package/dist/core/git.js.map +1 -0
- package/dist/core/hooks.d.ts +37 -0
- package/dist/core/hooks.d.ts.map +1 -0
- package/dist/core/hooks.js +77 -0
- package/dist/core/hooks.js.map +1 -0
- package/dist/core/i18n.d.ts +90 -0
- package/dist/core/i18n.d.ts.map +1 -0
- package/dist/core/i18n.js +253 -0
- package/dist/core/i18n.js.map +1 -0
- package/dist/core/lsp.d.ts +74 -0
- package/dist/core/lsp.d.ts.map +1 -0
- package/dist/core/lsp.js +239 -0
- package/dist/core/lsp.js.map +1 -0
- package/dist/core/mcp.d.ts +49 -0
- package/dist/core/mcp.d.ts.map +1 -0
- package/dist/core/mcp.js +195 -0
- package/dist/core/mcp.js.map +1 -0
- package/dist/core/memory.d.ts +38 -0
- package/dist/core/memory.d.ts.map +1 -0
- package/dist/core/memory.js +231 -0
- package/dist/core/memory.js.map +1 -0
- package/dist/core/metrics.d.ts +36 -0
- package/dist/core/metrics.d.ts.map +1 -0
- package/dist/core/metrics.js +111 -0
- package/dist/core/metrics.js.map +1 -0
- package/dist/core/review.d.ts +27 -0
- package/dist/core/review.d.ts.map +1 -0
- package/dist/core/review.js +201 -0
- package/dist/core/review.js.map +1 -0
- package/dist/core/sandbox.d.ts +52 -0
- package/dist/core/sandbox.d.ts.map +1 -0
- package/dist/core/sandbox.js +140 -0
- package/dist/core/sandbox.js.map +1 -0
- package/dist/core/scheduler.d.ts +56 -0
- package/dist/core/scheduler.d.ts.map +1 -0
- package/dist/core/scheduler.js +167 -0
- package/dist/core/scheduler.js.map +1 -0
- package/dist/core/session.d.ts +49 -0
- package/dist/core/session.d.ts.map +1 -0
- package/dist/core/session.js +127 -0
- package/dist/core/session.js.map +1 -0
- package/dist/core/skills.d.ts +36 -0
- package/dist/core/skills.d.ts.map +1 -0
- package/dist/core/skills.js +90 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/subagent.d.ts +45 -0
- package/dist/core/subagent.d.ts.map +1 -0
- package/dist/core/subagent.js +130 -0
- package/dist/core/subagent.js.map +1 -0
- package/dist/core/themes.d.ts +35 -0
- package/dist/core/themes.d.ts.map +1 -0
- package/dist/core/themes.js +188 -0
- package/dist/core/themes.js.map +1 -0
- package/dist/tools/bash.d.ts +3 -0
- package/dist/tools/bash.d.ts.map +1 -0
- package/dist/tools/bash.js +92 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/chrome-manager.d.ts +35 -0
- package/dist/tools/chrome-manager.d.ts.map +1 -0
- package/dist/tools/chrome-manager.js +163 -0
- package/dist/tools/chrome-manager.js.map +1 -0
- package/dist/tools/chrome.d.ts +78 -0
- package/dist/tools/chrome.d.ts.map +1 -0
- package/dist/tools/chrome.js +1058 -0
- package/dist/tools/chrome.js.map +1 -0
- package/dist/tools/edit.d.ts +3 -0
- package/dist/tools/edit.d.ts.map +1 -0
- package/dist/tools/edit.js +81 -0
- package/dist/tools/edit.js.map +1 -0
- package/dist/tools/glob.d.ts +3 -0
- package/dist/tools/glob.d.ts.map +1 -0
- package/dist/tools/glob.js +41 -0
- package/dist/tools/glob.js.map +1 -0
- package/dist/tools/grep.d.ts +3 -0
- package/dist/tools/grep.d.ts.map +1 -0
- package/dist/tools/grep.js +74 -0
- package/dist/tools/grep.js.map +1 -0
- package/dist/tools/path-safety.d.ts +3 -0
- package/dist/tools/path-safety.d.ts.map +1 -0
- package/dist/tools/path-safety.js +19 -0
- package/dist/tools/path-safety.js.map +1 -0
- package/dist/tools/read.d.ts +3 -0
- package/dist/tools/read.d.ts.map +1 -0
- package/dist/tools/read.js +58 -0
- package/dist/tools/read.js.map +1 -0
- package/dist/tools/registry.d.ts +4 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +43 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/types.d.ts +47 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +90 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/write.d.ts +3 -0
- package/dist/tools/write.d.ts.map +1 -0
- package/dist/tools/write.js +51 -0
- package/dist/tools/write.js.map +1 -0
- package/dist/ui/activity-cards.d.ts +50 -0
- package/dist/ui/activity-cards.d.ts.map +1 -0
- package/dist/ui/activity-cards.js +185 -0
- package/dist/ui/activity-cards.js.map +1 -0
- package/dist/ui/app.d.ts +9 -0
- package/dist/ui/app.d.ts.map +1 -0
- package/dist/ui/app.js +852 -0
- package/dist/ui/app.js.map +1 -0
- package/dist/ui/chat-view.d.ts +10 -0
- package/dist/ui/chat-view.d.ts.map +1 -0
- package/dist/ui/chat-view.js +94 -0
- package/dist/ui/chat-view.js.map +1 -0
- package/dist/ui/error-boundary.d.ts +13 -0
- package/dist/ui/error-boundary.d.ts.map +1 -0
- package/dist/ui/error-boundary.js +16 -0
- package/dist/ui/error-boundary.js.map +1 -0
- package/dist/ui/fade-in.d.ts +8 -0
- package/dist/ui/fade-in.d.ts.map +1 -0
- package/dist/ui/fade-in.js +14 -0
- package/dist/ui/fade-in.js.map +1 -0
- package/dist/ui/input-bar.d.ts +16 -0
- package/dist/ui/input-bar.d.ts.map +1 -0
- package/dist/ui/input-bar.js +269 -0
- package/dist/ui/input-bar.js.map +1 -0
- package/dist/ui/markdown-view.d.ts +9 -0
- package/dist/ui/markdown-view.d.ts.map +1 -0
- package/dist/ui/markdown-view.js +240 -0
- package/dist/ui/markdown-view.js.map +1 -0
- package/dist/ui/matrix-rain.d.ts +2 -0
- package/dist/ui/matrix-rain.d.ts.map +1 -0
- package/dist/ui/matrix-rain.js +134 -0
- package/dist/ui/matrix-rain.js.map +1 -0
- package/dist/ui/reasoning-view.d.ts +12 -0
- package/dist/ui/reasoning-view.d.ts.map +1 -0
- package/dist/ui/reasoning-view.js +34 -0
- package/dist/ui/reasoning-view.js.map +1 -0
- package/dist/ui/results-panel.d.ts +11 -0
- package/dist/ui/results-panel.d.ts.map +1 -0
- package/dist/ui/results-panel.js +17 -0
- package/dist/ui/results-panel.js.map +1 -0
- package/dist/ui/setup-wizard.d.ts +30 -0
- package/dist/ui/setup-wizard.d.ts.map +1 -0
- package/dist/ui/setup-wizard.js +166 -0
- package/dist/ui/setup-wizard.js.map +1 -0
- package/dist/ui/status-bar.d.ts +14 -0
- package/dist/ui/status-bar.d.ts.map +1 -0
- package/dist/ui/status-bar.js +63 -0
- package/dist/ui/status-bar.js.map +1 -0
- package/dist/ui/tool-activity-card.d.ts +9 -0
- package/dist/ui/tool-activity-card.d.ts.map +1 -0
- package/dist/ui/tool-activity-card.js +172 -0
- package/dist/ui/tool-activity-card.js.map +1 -0
- package/dist/ui/tool-call-view.d.ts +9 -0
- package/dist/ui/tool-call-view.d.ts.map +1 -0
- package/dist/ui/tool-call-view.js +149 -0
- package/dist/ui/tool-call-view.js.map +1 -0
- package/dist/utils/clipboard.d.ts +6 -0
- package/dist/utils/clipboard.d.ts.map +1 -0
- package/dist/utils/clipboard.js +56 -0
- package/dist/utils/clipboard.js.map +1 -0
- package/dist/utils/ignore.d.ts +6 -0
- package/dist/utils/ignore.d.ts.map +1 -0
- package/dist/utils/ignore.js +40 -0
- package/dist/utils/ignore.js.map +1 -0
- package/dist/utils/logger.d.ts +4 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +13 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/string-width.d.ts +6 -0
- package/dist/utils/string-width.d.ts.map +1 -0
- package/dist/utils/string-width.js +37 -0
- package/dist/utils/string-width.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useCallback } from 'react';
|
|
3
|
+
import { Box, Text } from 'ink';
|
|
4
|
+
import { DEEPSEEK_MODELS } from '../config/defaults.js';
|
|
5
|
+
import { saveConfig } from '../config/loader.js';
|
|
6
|
+
import { DeepSeekAPI } from '../api/index.js';
|
|
7
|
+
import { i18n } from '../core/i18n.js';
|
|
8
|
+
import { themeManager } from '../core/themes.js';
|
|
9
|
+
import { MatrixRain } from './matrix-rain.js';
|
|
10
|
+
// Logo — DEEPSEEK in ASCII art
|
|
11
|
+
const D = [
|
|
12
|
+
'██████╗ ',
|
|
13
|
+
'██╔══██╗',
|
|
14
|
+
'██║ ██║',
|
|
15
|
+
'██║ ██║',
|
|
16
|
+
'██████╔╝',
|
|
17
|
+
'╚═════╝ ',
|
|
18
|
+
];
|
|
19
|
+
const E = [
|
|
20
|
+
'███████╗',
|
|
21
|
+
'██╔════╝',
|
|
22
|
+
'█████╗ ',
|
|
23
|
+
'██╔══╝ ',
|
|
24
|
+
'███████╗',
|
|
25
|
+
'╚══════╝',
|
|
26
|
+
];
|
|
27
|
+
const P = [
|
|
28
|
+
'██████╗ ',
|
|
29
|
+
'██╔══██╗',
|
|
30
|
+
'██████╔╝',
|
|
31
|
+
'██╔═══╝ ',
|
|
32
|
+
'██║ ',
|
|
33
|
+
'╚═╝ ',
|
|
34
|
+
];
|
|
35
|
+
const S = [
|
|
36
|
+
'███████╗',
|
|
37
|
+
'██╔════╝',
|
|
38
|
+
'███████╗',
|
|
39
|
+
'╚════██║',
|
|
40
|
+
'███████║',
|
|
41
|
+
'╚══════╝',
|
|
42
|
+
];
|
|
43
|
+
const K = [
|
|
44
|
+
'██╗ ██╗',
|
|
45
|
+
'██║ ██╔╝',
|
|
46
|
+
'█████╔╝ ',
|
|
47
|
+
'██╔═██╗ ',
|
|
48
|
+
'██║ ██╗',
|
|
49
|
+
'╚═╝ ╚═╝',
|
|
50
|
+
];
|
|
51
|
+
const logoLines = [0, 1, 2, 3, 4, 5].map(i => D[i] + E[i] + E[i] + P[i] + S[i] + E[i] + E[i] + K[i]);
|
|
52
|
+
export function Logo() {
|
|
53
|
+
return (_jsx(Box, { flexDirection: 'column', alignItems: 'center', children: logoLines.map((line, i) => (_jsx(Text, { bold: true, color: 'blue', children: line }, i))) }));
|
|
54
|
+
}
|
|
55
|
+
function LangStep({ cursor, langOptions, langLabels }) {
|
|
56
|
+
return (_jsxs(Box, { flexDirection: 'column', marginLeft: 2, children: [_jsx(Text, { bold: true, children: i18n.t('selectLanguage') }), langOptions.map((lang, i) => (_jsxs(Text, { color: cursor === i ? 'cyan' : undefined, children: [cursor === i ? '❯ ' : ' ', langLabels[lang] ?? lang] }, lang)))] }));
|
|
57
|
+
}
|
|
58
|
+
function ApiKeyStep({ apiKeyError }) {
|
|
59
|
+
const colors = themeManager.getColors();
|
|
60
|
+
return (_jsxs(Box, { flexDirection: 'column', marginLeft: 2, children: [_jsx(Text, { bold: true, children: i18n.t('setupApiKey') }), _jsx(Text, { color: colors.textMuted, children: i18n.t('apiKeyHint') }), apiKeyError && _jsx(Text, { color: colors.error, children: apiKeyError })] }));
|
|
61
|
+
}
|
|
62
|
+
function ThemeStep({ cursor }) {
|
|
63
|
+
const colors = themeManager.getColors();
|
|
64
|
+
const themes = themeManager.listThemes();
|
|
65
|
+
return (_jsxs(Box, { flexDirection: 'column', children: [_jsx(MatrixRain, {}), _jsxs(Box, { flexDirection: 'column', marginLeft: 2, marginTop: 1, children: [_jsx(Text, { bold: true, children: i18n.t('selectTheme') }), themes.map((theme, i) => (_jsxs(Text, { color: cursor === i ? colors.primary : colors.textMuted, children: [cursor === i ? '❯ ' : ' ', theme.name, theme.description ? ` — ${theme.description}` : ''] }, theme.name)))] })] }));
|
|
66
|
+
}
|
|
67
|
+
function ModelStep({ cursor }) {
|
|
68
|
+
const colors = themeManager.getColors();
|
|
69
|
+
return (_jsxs(Box, { flexDirection: 'column', marginLeft: 2, children: [_jsx(Text, { bold: true, children: "Select model" }), DEEPSEEK_MODELS.map((model, i) => (_jsxs(Box, { flexDirection: 'column', children: [_jsxs(Text, { color: cursor === i ? colors.primary : colors.textMuted, children: [cursor === i ? '❯ ' : ' ', _jsx(Text, { bold: cursor === i, children: model.label }), _jsxs(Text, { dimColor: true, children: [" ", model.id] })] }), _jsxs(Text, { color: cursor === i ? colors.textMuted : colors.textMuted, dimColor: true, children: [' ', model.description] })] }, model.id)))] }));
|
|
70
|
+
}
|
|
71
|
+
function ModeStep({ cursor, modeOptions }) {
|
|
72
|
+
return (_jsxs(Box, { flexDirection: 'column', marginLeft: 2, children: [_jsx(Text, { bold: true, children: i18n.t('selectMode') }), modeOptions.map((mode, i) => (_jsxs(Text, { color: cursor === i ? 'cyan' : undefined, children: [cursor === i ? '❯ ' : ' ', mode] }, mode)))] }));
|
|
73
|
+
}
|
|
74
|
+
export function useSetupWizard(config, initialStep = 'lang', onSetupComplete, onMessage) {
|
|
75
|
+
const [step, setStep] = useState(initialStep);
|
|
76
|
+
const [apiKeyError, setApiKeyError] = useState('');
|
|
77
|
+
const [langCursor, setLangCursor] = useState(0);
|
|
78
|
+
const [themeCursor, setThemeCursor] = useState(0);
|
|
79
|
+
const [modelCursor, setModelCursor] = useState(0);
|
|
80
|
+
const [modeCursor, setModeCursor] = useState(0);
|
|
81
|
+
const langOptions = ['en', 'ru', 'zh'];
|
|
82
|
+
const modeOptions = ['plan', 'default', 'auto-edit', 'turbo'];
|
|
83
|
+
const handleApiKeySubmit = useCallback(async (key) => {
|
|
84
|
+
if (!key || key.trim().length === 0) {
|
|
85
|
+
setApiKeyError('API key cannot be empty');
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const testApi = new DeepSeekAPI({ ...config, apiKey: key });
|
|
89
|
+
const result = await testApi.validateKey();
|
|
90
|
+
if (!result.valid) {
|
|
91
|
+
setApiKeyError(result.error || 'Invalid API key');
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
await saveConfig({ ...config, apiKey: key });
|
|
95
|
+
setApiKeyError('');
|
|
96
|
+
onMessage({
|
|
97
|
+
role: 'assistant',
|
|
98
|
+
content: '⚠️ **Безопасность:** API-ключ хранится локально в `~/.deepseek-code/config.json`. Безопаснее использовать переменную окружения `DEEPSEEK_API_KEY`.',
|
|
99
|
+
});
|
|
100
|
+
setStep('theme');
|
|
101
|
+
}, [config, onMessage]);
|
|
102
|
+
const finishSetup = useCallback(async () => {
|
|
103
|
+
const themeName = themeManager.listThemes()[themeCursor]?.name ?? 'default-dark';
|
|
104
|
+
const modelId = DEEPSEEK_MODELS[modelCursor]?.id ?? 'deepseek-chat';
|
|
105
|
+
const mode = modeOptions[modeCursor] ?? 'default';
|
|
106
|
+
await saveConfig({
|
|
107
|
+
...config,
|
|
108
|
+
language: langOptions[langCursor] ?? 'en',
|
|
109
|
+
theme: themeName,
|
|
110
|
+
model: modelId,
|
|
111
|
+
approvalMode: mode,
|
|
112
|
+
});
|
|
113
|
+
i18n.setLocale(langOptions[langCursor] ?? 'en');
|
|
114
|
+
themeManager.setTheme(themeName);
|
|
115
|
+
onSetupComplete({
|
|
116
|
+
...config,
|
|
117
|
+
language: langOptions[langCursor] ?? 'en',
|
|
118
|
+
theme: themeName,
|
|
119
|
+
model: modelId,
|
|
120
|
+
approvalMode: mode,
|
|
121
|
+
});
|
|
122
|
+
setStep('done');
|
|
123
|
+
}, [config, langCursor, themeCursor, modelCursor, modeCursor, langOptions, modeOptions, onSetupComplete]);
|
|
124
|
+
const state = {
|
|
125
|
+
step,
|
|
126
|
+
apiKeyError,
|
|
127
|
+
langCursor,
|
|
128
|
+
themeCursor,
|
|
129
|
+
modelCursor,
|
|
130
|
+
modeCursor,
|
|
131
|
+
langOptions,
|
|
132
|
+
modeOptions,
|
|
133
|
+
};
|
|
134
|
+
const actions = {
|
|
135
|
+
handleApiKeySubmit,
|
|
136
|
+
finishSetup,
|
|
137
|
+
setLangCursor,
|
|
138
|
+
setThemeCursor,
|
|
139
|
+
setModelCursor,
|
|
140
|
+
setModeCursor,
|
|
141
|
+
setStep,
|
|
142
|
+
setApiKeyError,
|
|
143
|
+
};
|
|
144
|
+
return [state, actions];
|
|
145
|
+
}
|
|
146
|
+
// ─── Setup Wizard Render ─────────────────────────────────────────────────────
|
|
147
|
+
export function SetupWizard({ state }) {
|
|
148
|
+
const { step, apiKeyError, langCursor, themeCursor, modelCursor, modeCursor, langOptions, modeOptions } = state;
|
|
149
|
+
const langLabels = {
|
|
150
|
+
en: 'English',
|
|
151
|
+
ru: 'Русский',
|
|
152
|
+
zh: '中文',
|
|
153
|
+
};
|
|
154
|
+
return (_jsxs(Box, { flexDirection: 'column', flexGrow: 1, children: [_jsx(Logo, {}), _jsx(Box, { marginTop: 1, children: step === 'lang'
|
|
155
|
+
? _jsx(LangStep, { cursor: langCursor, langOptions: langOptions, langLabels: langLabels })
|
|
156
|
+
: step === 'apikey'
|
|
157
|
+
? _jsx(ApiKeyStep, { apiKeyError: apiKeyError })
|
|
158
|
+
: step === 'theme'
|
|
159
|
+
? _jsx(ThemeStep, { cursor: themeCursor })
|
|
160
|
+
: step === 'model'
|
|
161
|
+
? _jsx(ModelStep, { cursor: modelCursor })
|
|
162
|
+
: step === 'mode'
|
|
163
|
+
? _jsx(ModeStep, { cursor: modeCursor, modeOptions: modeOptions })
|
|
164
|
+
: null })] }));
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=setup-wizard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-wizard.js","sourceRoot":"","sources":["../../src/ui/setup-wizard.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ApprovalMode } from '../config/defaults.js';
|
|
2
|
+
interface StatusBarProps {
|
|
3
|
+
mode: ApprovalMode;
|
|
4
|
+
status: string;
|
|
5
|
+
messageCount: number;
|
|
6
|
+
isProcessing?: boolean;
|
|
7
|
+
contextPercent?: number;
|
|
8
|
+
totalTokens?: number;
|
|
9
|
+
estimatedCost?: number;
|
|
10
|
+
model?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function StatusBar({ mode, status, messageCount, isProcessing, contextPercent, totalTokens, estimatedCost, model }: StatusBarProps): import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=status-bar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-bar.d.ts","sourceRoot":"","sources":["../../src/ui/status-bar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAKzD,UAAU,cAAc;IACtB,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAiBD,wBAAgB,SAAS,CAAE,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,cAAc,2CAiFzI"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useState } from 'react';
|
|
3
|
+
import { Box, Text } from 'ink';
|
|
4
|
+
import { i18n } from '../core/i18n.js';
|
|
5
|
+
import { themeManager } from '../core/themes.js';
|
|
6
|
+
import { chromeManager } from '../tools/chrome-manager.js';
|
|
7
|
+
function tokAbbr(n) {
|
|
8
|
+
if (n >= 1_000_000)
|
|
9
|
+
return `${(n / 1_000_000).toFixed(1)}M`;
|
|
10
|
+
if (n >= 1_000)
|
|
11
|
+
return `${(n / 1_000).toFixed(1)}k`;
|
|
12
|
+
return n.toString();
|
|
13
|
+
}
|
|
14
|
+
const modeLabels = {
|
|
15
|
+
plan: 'PLAN',
|
|
16
|
+
default: 'DEFAULT',
|
|
17
|
+
'auto-edit': 'AUTO-EDIT',
|
|
18
|
+
turbo: 'TURBO',
|
|
19
|
+
};
|
|
20
|
+
const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
21
|
+
export function StatusBar({ mode, status, messageCount, isProcessing, contextPercent, totalTokens, estimatedCost, model }) {
|
|
22
|
+
const colors = themeManager.getColors();
|
|
23
|
+
const modeColors = {
|
|
24
|
+
plan: colors.warning,
|
|
25
|
+
default: colors.info,
|
|
26
|
+
'auto-edit': colors.success,
|
|
27
|
+
turbo: colors.error,
|
|
28
|
+
};
|
|
29
|
+
const pulseColors = [colors.warning, colors.info, colors.success, colors.text];
|
|
30
|
+
const [chromeState, setChromeState] = useState(chromeManager.getState());
|
|
31
|
+
const [spinnerFrame, setSpinnerFrame] = useState(0);
|
|
32
|
+
const [pulseIdx, setPulseIdx] = useState(0);
|
|
33
|
+
useEffect(() => {
|
|
34
|
+
if (!isProcessing)
|
|
35
|
+
return;
|
|
36
|
+
const interval = setInterval(() => {
|
|
37
|
+
setSpinnerFrame(prev => (prev + 1) % SPINNER_FRAMES.length);
|
|
38
|
+
}, 80);
|
|
39
|
+
return () => clearInterval(interval);
|
|
40
|
+
}, [isProcessing]);
|
|
41
|
+
useEffect(() => {
|
|
42
|
+
if (!isProcessing)
|
|
43
|
+
return;
|
|
44
|
+
const interval = setInterval(() => {
|
|
45
|
+
setPulseIdx(prev => (prev + 1) % 4);
|
|
46
|
+
}, 400);
|
|
47
|
+
return () => clearInterval(interval);
|
|
48
|
+
}, [isProcessing]);
|
|
49
|
+
useEffect(() => {
|
|
50
|
+
setChromeState(chromeManager.getState());
|
|
51
|
+
const handleStateChange = (state) => {
|
|
52
|
+
setChromeState(state);
|
|
53
|
+
};
|
|
54
|
+
chromeManager.on('stateChange', handleStateChange);
|
|
55
|
+
return () => {
|
|
56
|
+
chromeManager.off('stateChange', handleStateChange);
|
|
57
|
+
};
|
|
58
|
+
}, []);
|
|
59
|
+
return (_jsxs(Box, { borderStyle: 'single', borderColor: colors.border, paddingX: 1, children: [_jsxs(Box, { flexGrow: 1, children: [_jsxs(Text, { bold: true, color: modeColors[mode], children: ["[", modeLabels[mode], "]"] }), _jsx(Text, { children: " " }), isProcessing
|
|
60
|
+
? (_jsxs(Text, { children: [_jsx(Text, { color: pulseColors[pulseIdx % pulseColors.length], children: SPINNER_FRAMES[spinnerFrame] }), ' ', _jsx(Text, { color: pulseColors[pulseIdx % pulseColors.length], bold: true, children: i18n.t('thinking') })] }))
|
|
61
|
+
: _jsx(Text, { color: colors.textMuted, children: status })] }), _jsxs(Box, { children: [chromeState.connected && (_jsxs(Text, { color: colors.success, children: [" \uD83C\uDF10Chrome", chromeState.headless ? ':H' : '', " "] })), totalTokens !== undefined && totalTokens > 0 && (_jsxs(Text, { color: colors.textMuted, children: [" ", tokAbbr(totalTokens), " tok "] })), estimatedCost !== undefined && estimatedCost > 0 && (_jsxs(Text, { color: colors.textMuted, children: ["$", estimatedCost.toFixed(3), " "] })), contextPercent !== undefined && contextPercent > 0 && (_jsxs(Text, { color: contextPercent > 80 ? colors.error : contextPercent > 50 ? colors.warning : colors.textMuted, children: ["ctx:", contextPercent, "%", ' '] })), model && (_jsxs(Text, { color: colors.textMuted, children: [model === 'deepseek-chat' ? 'V3' : model === 'deepseek-reasoner' ? 'R1' : model, ' '] })), _jsxs(Text, { color: colors.textMuted, children: [i18n.t('system'), ": ", messageCount] })] })] }));
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=status-bar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-bar.js","sourceRoot":"","sources":["../../src/ui/status-bar.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { ToolCallEvent } from '../core/agent-loop.js';
|
|
3
|
+
interface ToolActivityCardProps {
|
|
4
|
+
toolCalls: ToolCallEvent[];
|
|
5
|
+
status?: 'live' | 'compact';
|
|
6
|
+
}
|
|
7
|
+
export declare const ToolActivityCard: React.NamedExoticComponent<ToolActivityCardProps>;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=tool-activity-card.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-activity-card.d.ts","sourceRoot":"","sources":["../../src/ui/tool-activity-card.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAA;AAElD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAO1D,UAAU,qBAAqB;IAC7B,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B;AAkGD,eAAO,MAAM,gBAAgB,mDA4G3B,CAAA"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import React, { useState, useEffect } from 'react';
|
|
3
|
+
import { Box, Text } from 'ink';
|
|
4
|
+
import { themeManager } from '../core/themes.js';
|
|
5
|
+
import { formatDuration } from '../utils/string-width.js';
|
|
6
|
+
const BASH_TIMEOUT_MS = 30_000;
|
|
7
|
+
const DEFAULT_TIMEOUT_MS = 10_000;
|
|
8
|
+
const statusIcons = {
|
|
9
|
+
pending: '⏳',
|
|
10
|
+
running: '🔄',
|
|
11
|
+
completed: '✅',
|
|
12
|
+
failed: '❌',
|
|
13
|
+
rejected: '🚫',
|
|
14
|
+
};
|
|
15
|
+
function formatArgs(args) {
|
|
16
|
+
const entries = Object.entries(args);
|
|
17
|
+
if (entries.length === 0)
|
|
18
|
+
return '';
|
|
19
|
+
return entries.map(([key, value]) => {
|
|
20
|
+
const str = typeof value === 'string' ? value : JSON.stringify(value);
|
|
21
|
+
const truncated = str.length > 80 ? `${str.slice(0, 77)}...` : str;
|
|
22
|
+
return `${key}: ${truncated}`;
|
|
23
|
+
}).join(', ');
|
|
24
|
+
}
|
|
25
|
+
function formatChromeArgs(args) {
|
|
26
|
+
const action = args.action;
|
|
27
|
+
const url = args.url;
|
|
28
|
+
const selector = args.selector;
|
|
29
|
+
const text = args.text;
|
|
30
|
+
const code = args.code;
|
|
31
|
+
const sameTab = args.sameTab;
|
|
32
|
+
const headless = args.headless;
|
|
33
|
+
const parts = [];
|
|
34
|
+
if (url)
|
|
35
|
+
parts.push(url);
|
|
36
|
+
if (selector)
|
|
37
|
+
parts.push(`"${selector}"`);
|
|
38
|
+
if (text)
|
|
39
|
+
parts.push(`"${text}"`);
|
|
40
|
+
if (code) {
|
|
41
|
+
const truncated = code.length > 50 ? `${code.slice(0, 47)}...` : code;
|
|
42
|
+
parts.push(`\`${truncated}\``);
|
|
43
|
+
}
|
|
44
|
+
if (sameTab)
|
|
45
|
+
parts.push('(same-tab)');
|
|
46
|
+
if (headless)
|
|
47
|
+
parts.push('(headless)');
|
|
48
|
+
const actionLabels = {
|
|
49
|
+
open: 'Open',
|
|
50
|
+
click: 'Click',
|
|
51
|
+
fill: 'Fill',
|
|
52
|
+
eval: 'Eval',
|
|
53
|
+
text: 'Text',
|
|
54
|
+
html: 'HTML',
|
|
55
|
+
console: 'Console',
|
|
56
|
+
network: 'Network',
|
|
57
|
+
state: 'State',
|
|
58
|
+
shot: 'Screenshot',
|
|
59
|
+
nav: 'Navigate',
|
|
60
|
+
wait: 'Wait',
|
|
61
|
+
scroll: 'Scroll',
|
|
62
|
+
locator: 'Locator',
|
|
63
|
+
cookies: 'Cookies',
|
|
64
|
+
storage: 'Storage',
|
|
65
|
+
quiz: 'Quiz',
|
|
66
|
+
};
|
|
67
|
+
const label = actionLabels[action] ?? action;
|
|
68
|
+
return `${label}${parts.length > 0 ? ` ${parts.join(' ')}` : ''}`;
|
|
69
|
+
}
|
|
70
|
+
function groupToolCalls(calls) {
|
|
71
|
+
const groups = new Map();
|
|
72
|
+
for (const tc of calls) {
|
|
73
|
+
const existing = groups.get(tc.name) ?? [];
|
|
74
|
+
existing.push(tc);
|
|
75
|
+
groups.set(tc.name, existing);
|
|
76
|
+
}
|
|
77
|
+
const result = [];
|
|
78
|
+
for (const [name, entries] of groups) {
|
|
79
|
+
const latest = entries[entries.length - 1];
|
|
80
|
+
let status = 'completed';
|
|
81
|
+
for (const e of entries) {
|
|
82
|
+
if (e.status === 'running' || e.status === 'pending') {
|
|
83
|
+
status = 'running';
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
if (e.status === 'failed') {
|
|
87
|
+
status = 'failed';
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
if (e.status === 'rejected') {
|
|
91
|
+
status = 'rejected';
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
result.push({ name, count: entries.length, latest, status });
|
|
96
|
+
}
|
|
97
|
+
result.sort((a, b) => {
|
|
98
|
+
if (a.status === 'running' && b.status !== 'running')
|
|
99
|
+
return -1;
|
|
100
|
+
if (b.status === 'running' && a.status !== 'running')
|
|
101
|
+
return 1;
|
|
102
|
+
return 0;
|
|
103
|
+
});
|
|
104
|
+
return result;
|
|
105
|
+
}
|
|
106
|
+
export const ToolActivityCard = React.memo(function ToolActivityCard({ toolCalls, status = 'live' }) {
|
|
107
|
+
const colors = themeManager.getColors();
|
|
108
|
+
const [now, setNow] = useState(() => Date.now());
|
|
109
|
+
const isAnyRunning = toolCalls.some(tc => tc.status === 'running');
|
|
110
|
+
useEffect(() => {
|
|
111
|
+
if (!isAnyRunning)
|
|
112
|
+
return;
|
|
113
|
+
const id = setInterval(() => setNow(Date.now()), 500);
|
|
114
|
+
return () => clearInterval(id);
|
|
115
|
+
}, [isAnyRunning]);
|
|
116
|
+
function elapsedColor(elapsed, timeoutMs) {
|
|
117
|
+
const ratio = elapsed / timeoutMs;
|
|
118
|
+
if (ratio >= 0.9)
|
|
119
|
+
return colors.error;
|
|
120
|
+
if (ratio >= 0.6)
|
|
121
|
+
return colors.warning;
|
|
122
|
+
return colors.success;
|
|
123
|
+
}
|
|
124
|
+
const statusColors = {
|
|
125
|
+
pending: colors.warning,
|
|
126
|
+
running: colors.info,
|
|
127
|
+
completed: colors.success,
|
|
128
|
+
failed: colors.error,
|
|
129
|
+
rejected: colors.error,
|
|
130
|
+
};
|
|
131
|
+
if (toolCalls.length === 0)
|
|
132
|
+
return null;
|
|
133
|
+
const groups = groupToolCalls(toolCalls);
|
|
134
|
+
const totalDuration = toolCalls.reduce((sum, tc) => sum + (tc.durationMs ?? 0), 0);
|
|
135
|
+
const uniqueTypes = groups.length;
|
|
136
|
+
// Compact mode: single-line summary
|
|
137
|
+
if (status === 'compact') {
|
|
138
|
+
const toolList = groups.map(g => `${g.name}${g.count > 1 ? ` ×${g.count}` : ''}`).join(', ');
|
|
139
|
+
const hasErrors = groups.some(g => g.status === 'failed' || g.status === 'rejected');
|
|
140
|
+
return (_jsx(Box, { marginLeft: 2, marginBottom: 1, children: _jsxs(Text, { dimColor: true, children: [hasErrors ? '⚠️ ' : '🔧 ', "\u0418\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u044B: ", toolList, ' · ', toolCalls.length, " call", toolCalls.length !== 1 ? 's' : '', totalDuration > 0 ? ` · ${formatDuration(totalDuration)}` : ''] }) }));
|
|
141
|
+
}
|
|
142
|
+
// Live mode: grouped display with border
|
|
143
|
+
return (_jsx(Box, { flexDirection: 'column', marginLeft: 2, marginBottom: 1, children: _jsx(Box, { borderStyle: 'round', borderColor: colors.border, paddingX: 1, paddingY: 0, children: _jsxs(Box, { flexDirection: 'column', children: [groups.map((group) => {
|
|
144
|
+
const icon = statusIcons[group.status] ?? '✳';
|
|
145
|
+
const color = statusColors[group.status] ?? 'white';
|
|
146
|
+
const isRunning = group.status === 'running';
|
|
147
|
+
const isChrome = group.name === 'chrome';
|
|
148
|
+
const isBash = group.name === 'run_shell_command';
|
|
149
|
+
const displayArgs = isChrome
|
|
150
|
+
? formatChromeArgs(group.latest.arguments)
|
|
151
|
+
: formatArgs(group.latest.arguments);
|
|
152
|
+
const inlineResult = group.latest.status === 'completed' && group.latest.result && group.latest.result.length > 0
|
|
153
|
+
? ` → ${group.latest.result.slice(0, 60)}${group.latest.result.length > 60 ? '…' : ''}`
|
|
154
|
+
: null;
|
|
155
|
+
const inlineError = group.latest.status === 'failed' && group.latest.error
|
|
156
|
+
? ` ✗ ${group.latest.error.slice(0, 100)}`
|
|
157
|
+
: null;
|
|
158
|
+
let durationDisplay = null;
|
|
159
|
+
if (isRunning && group.latest.startedAt !== undefined) {
|
|
160
|
+
const elapsed = now - group.latest.startedAt;
|
|
161
|
+
const timeoutMs = isBash ? BASH_TIMEOUT_MS : DEFAULT_TIMEOUT_MS;
|
|
162
|
+
const eColor = elapsedColor(elapsed, timeoutMs);
|
|
163
|
+
const warning = elapsed / timeoutMs >= 0.75 ? ' ⚠' : '';
|
|
164
|
+
durationDisplay = _jsxs(Text, { color: eColor, children: [" ", formatDuration(elapsed), warning] });
|
|
165
|
+
}
|
|
166
|
+
else if (group.latest.durationMs) {
|
|
167
|
+
durationDisplay = _jsxs(Text, { dimColor: true, children: [" - ", formatDuration(group.latest.durationMs)] });
|
|
168
|
+
}
|
|
169
|
+
return (_jsx(Box, { children: _jsxs(Text, { children: [_jsx(Text, { color: color, children: icon }), ' ', _jsx(Text, { bold: true, color: color, children: group.name }), group.count > 1 && _jsxs(Text, { color: color, children: [" \u00D7", group.count] }), displayArgs ? _jsxs(Text, { dimColor: true, children: [" ", displayArgs] }) : null, durationDisplay, inlineResult ? _jsx(Text, { dimColor: true, children: inlineResult }) : null, inlineError ? _jsx(Text, { color: colors.error, children: inlineError }) : null] }) }, group.name));
|
|
170
|
+
}), _jsx(Box, { children: _jsxs(Text, { dimColor: true, children: [toolCalls.length, " tool call", toolCalls.length !== 1 ? 's' : '', uniqueTypes > 1 ? ` (${uniqueTypes} types)` : '', totalDuration > 0 ? ` · ${formatDuration(totalDuration)} total` : ''] }) })] }) }) }));
|
|
171
|
+
});
|
|
172
|
+
//# sourceMappingURL=tool-activity-card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-activity-card.js","sourceRoot":"","sources":["../../src/ui/tool-activity-card.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { ToolCallEvent } from '../core/agent-loop.js';
|
|
3
|
+
interface ToolCallViewProps {
|
|
4
|
+
toolCalls: ToolCallEvent[];
|
|
5
|
+
maxItems?: number;
|
|
6
|
+
}
|
|
7
|
+
export declare const ToolCallView: React.NamedExoticComponent<ToolCallViewProps>;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=tool-call-view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-call-view.d.ts","sourceRoot":"","sources":["../../src/ui/tool-call-view.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAI1D,UAAU,iBAAiB;IACzB,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA+GD,eAAO,MAAM,YAAY,+CA4DvB,CAAA"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { Box, Text } from 'ink';
|
|
4
|
+
import { themeManager } from '../core/themes.js';
|
|
5
|
+
import { FadeIn } from './fade-in.js';
|
|
6
|
+
const statusIcons = {
|
|
7
|
+
pending: '⏳',
|
|
8
|
+
running: '🔄',
|
|
9
|
+
completed: '✅',
|
|
10
|
+
failed: '❌',
|
|
11
|
+
rejected: '🚫',
|
|
12
|
+
};
|
|
13
|
+
function formatDuration(ms) {
|
|
14
|
+
if (ms === undefined)
|
|
15
|
+
return '';
|
|
16
|
+
if (ms < 1000)
|
|
17
|
+
return `${ms}ms`;
|
|
18
|
+
return `${(ms / 1000).toFixed(1)}s`;
|
|
19
|
+
}
|
|
20
|
+
function formatArgs(args) {
|
|
21
|
+
const entries = Object.entries(args);
|
|
22
|
+
if (entries.length === 0)
|
|
23
|
+
return '';
|
|
24
|
+
return entries.map(([key, value]) => {
|
|
25
|
+
const str = typeof value === 'string' ? value : JSON.stringify(value);
|
|
26
|
+
const truncated = str.length > 80 ? `${str.slice(0, 77)}...` : str;
|
|
27
|
+
return `${key}: ${truncated}`;
|
|
28
|
+
}).join(', ');
|
|
29
|
+
}
|
|
30
|
+
function formatChromeArgs(args) {
|
|
31
|
+
const action = args.action;
|
|
32
|
+
const url = args.url;
|
|
33
|
+
const selector = args.selector;
|
|
34
|
+
const text = args.text;
|
|
35
|
+
const code = args.code;
|
|
36
|
+
const sameTab = args.sameTab;
|
|
37
|
+
const headless = args.headless;
|
|
38
|
+
const parts = [];
|
|
39
|
+
if (url)
|
|
40
|
+
parts.push(url);
|
|
41
|
+
if (selector)
|
|
42
|
+
parts.push(`"${selector}"`);
|
|
43
|
+
if (text)
|
|
44
|
+
parts.push(`"${text}"`);
|
|
45
|
+
if (code) {
|
|
46
|
+
const truncated = code.length > 50 ? `${code.slice(0, 47)}...` : code;
|
|
47
|
+
parts.push(`\`${truncated}\``);
|
|
48
|
+
}
|
|
49
|
+
if (sameTab)
|
|
50
|
+
parts.push('(same-tab)');
|
|
51
|
+
if (headless)
|
|
52
|
+
parts.push('(headless)');
|
|
53
|
+
const actionLabels = {
|
|
54
|
+
open: 'Open',
|
|
55
|
+
click: 'Click',
|
|
56
|
+
fill: 'Fill',
|
|
57
|
+
eval: 'Eval',
|
|
58
|
+
text: 'Text',
|
|
59
|
+
html: 'HTML',
|
|
60
|
+
console: 'Console',
|
|
61
|
+
network: 'Network',
|
|
62
|
+
state: 'State',
|
|
63
|
+
shot: 'Screenshot',
|
|
64
|
+
nav: 'Navigate',
|
|
65
|
+
wait: 'Wait',
|
|
66
|
+
scroll: 'Scroll',
|
|
67
|
+
locator: 'Locator',
|
|
68
|
+
cookies: 'Cookies',
|
|
69
|
+
storage: 'Storage',
|
|
70
|
+
quiz: 'Quiz',
|
|
71
|
+
};
|
|
72
|
+
const label = actionLabels[action] ?? action;
|
|
73
|
+
return `${label}${parts.length > 0 ? ` ${parts.join(' ')}` : ''}`;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Group tool calls by name, returning summary entries.
|
|
77
|
+
* Each group shows: name × count, status icon of latest, latest target.
|
|
78
|
+
*/
|
|
79
|
+
function groupToolCalls(calls) {
|
|
80
|
+
const groups = new Map();
|
|
81
|
+
for (const tc of calls) {
|
|
82
|
+
const existing = groups.get(tc.name) ?? [];
|
|
83
|
+
existing.push(tc);
|
|
84
|
+
groups.set(tc.name, existing);
|
|
85
|
+
}
|
|
86
|
+
const result = [];
|
|
87
|
+
for (const [name, entries] of groups) {
|
|
88
|
+
const latest = entries[entries.length - 1];
|
|
89
|
+
// Determine aggregate status: if any failed, group is failed; if any running, group is running
|
|
90
|
+
let status = 'completed';
|
|
91
|
+
for (const e of entries) {
|
|
92
|
+
if (e.status === 'running' || e.status === 'pending') {
|
|
93
|
+
status = 'running';
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
if (e.status === 'failed') {
|
|
97
|
+
status = 'failed';
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
if (e.status === 'rejected') {
|
|
101
|
+
status = 'rejected';
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
result.push({ name, count: entries.length, latest, status });
|
|
106
|
+
}
|
|
107
|
+
// Sort: running first, then by recency
|
|
108
|
+
result.sort((a, b) => {
|
|
109
|
+
if (a.status === 'running' && b.status !== 'running')
|
|
110
|
+
return -1;
|
|
111
|
+
if (b.status === 'running' && a.status !== 'running')
|
|
112
|
+
return 1;
|
|
113
|
+
return 0;
|
|
114
|
+
});
|
|
115
|
+
return result;
|
|
116
|
+
}
|
|
117
|
+
export const ToolCallView = React.memo(function ToolCallView({ toolCalls, maxItems }) {
|
|
118
|
+
const colors = themeManager.getColors();
|
|
119
|
+
const statusColors = {
|
|
120
|
+
pending: colors.warning,
|
|
121
|
+
running: colors.info,
|
|
122
|
+
completed: colors.success,
|
|
123
|
+
failed: colors.error,
|
|
124
|
+
rejected: colors.error,
|
|
125
|
+
};
|
|
126
|
+
if (toolCalls.length === 0)
|
|
127
|
+
return null;
|
|
128
|
+
// Group tool calls for compact display
|
|
129
|
+
const groups = groupToolCalls(toolCalls);
|
|
130
|
+
const visible = maxItems !== undefined ? groups.slice(0, maxItems) : groups;
|
|
131
|
+
const hidden = groups.length - visible.length;
|
|
132
|
+
return (_jsxs(Box, { flexDirection: 'column', marginLeft: 2, children: [hidden > 0 && (_jsx(Box, { children: _jsxs(Text, { dimColor: true, children: [" \u2191 ", hidden, " more tool type", hidden > 1 ? 's' : ''] }) })), visible.map((group) => {
|
|
133
|
+
const icon = statusIcons[group.status] ?? '✳';
|
|
134
|
+
const color = statusColors[group.status] ?? 'white';
|
|
135
|
+
const duration = group.latest.durationMs ? formatDuration(group.latest.durationMs) : '';
|
|
136
|
+
const isChrome = group.name === 'chrome';
|
|
137
|
+
const displayArgs = isChrome
|
|
138
|
+
? formatChromeArgs(group.latest.arguments)
|
|
139
|
+
: formatArgs(group.latest.arguments);
|
|
140
|
+
const inlineResult = group.latest.status === 'completed' && group.latest.result && group.latest.result.length > 0
|
|
141
|
+
? ` → ${group.latest.result.slice(0, 60)}${group.latest.result.length > 60 ? '…' : ''}`
|
|
142
|
+
: null;
|
|
143
|
+
const inlineError = group.latest.status === 'failed' && group.latest.error
|
|
144
|
+
? ` ✗ ${group.latest.error.slice(0, 100)}`
|
|
145
|
+
: null;
|
|
146
|
+
return (_jsx(FadeIn, { delay: 150, children: _jsx(Box, { children: _jsxs(Text, { children: [' ', _jsx(Text, { color: color, children: icon }), ' ', _jsx(Text, { bold: true, color: color, children: group.name }), group.count > 1 && _jsxs(Text, { color: color, children: [" \u00D7", group.count] }), displayArgs ? _jsxs(Text, { dimColor: true, children: [" ", displayArgs] }) : null, duration ? _jsxs(Text, { dimColor: true, children: [" - ", duration] }) : null, inlineResult ? _jsx(Text, { dimColor: true, children: inlineResult }) : null, inlineError ? _jsx(Text, { color: colors.error, children: inlineError }) : null] }) }) }, group.name));
|
|
147
|
+
})] }));
|
|
148
|
+
});
|
|
149
|
+
//# sourceMappingURL=tool-call-view.js.map
|