@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.
Files changed (216) hide show
  1. package/CONTRIBUTING.md +73 -0
  2. package/README.md +194 -0
  3. package/README.ru.md +194 -0
  4. package/dist/api/index.d.ts +77 -0
  5. package/dist/api/index.d.ts.map +1 -0
  6. package/dist/api/index.js +263 -0
  7. package/dist/api/index.js.map +1 -0
  8. package/dist/cli/headless.d.ts +22 -0
  9. package/dist/cli/headless.d.ts.map +1 -0
  10. package/dist/cli/headless.js +122 -0
  11. package/dist/cli/headless.js.map +1 -0
  12. package/dist/cli/index.d.ts +3 -0
  13. package/dist/cli/index.d.ts.map +1 -0
  14. package/dist/cli/index.js +90 -0
  15. package/dist/cli/index.js.map +1 -0
  16. package/dist/cli/interactive.d.ts +18 -0
  17. package/dist/cli/interactive.d.ts.map +1 -0
  18. package/dist/cli/interactive.js +75 -0
  19. package/dist/cli/interactive.js.map +1 -0
  20. package/dist/commands/index.d.ts +30 -0
  21. package/dist/commands/index.d.ts.map +1 -0
  22. package/dist/commands/index.js +964 -0
  23. package/dist/commands/index.js.map +1 -0
  24. package/dist/config/defaults.d.ts +37 -0
  25. package/dist/config/defaults.d.ts.map +1 -0
  26. package/dist/config/defaults.js +39 -0
  27. package/dist/config/defaults.js.map +1 -0
  28. package/dist/config/loader.d.ts +4 -0
  29. package/dist/config/loader.d.ts.map +1 -0
  30. package/dist/config/loader.js +76 -0
  31. package/dist/config/loader.js.map +1 -0
  32. package/dist/core/agent-loop.d.ts +111 -0
  33. package/dist/core/agent-loop.d.ts.map +1 -0
  34. package/dist/core/agent-loop.js +485 -0
  35. package/dist/core/agent-loop.js.map +1 -0
  36. package/dist/core/checkpoint.d.ts +10 -0
  37. package/dist/core/checkpoint.d.ts.map +1 -0
  38. package/dist/core/checkpoint.js +83 -0
  39. package/dist/core/checkpoint.js.map +1 -0
  40. package/dist/core/extensions.d.ts +55 -0
  41. package/dist/core/extensions.d.ts.map +1 -0
  42. package/dist/core/extensions.js +113 -0
  43. package/dist/core/extensions.js.map +1 -0
  44. package/dist/core/git.d.ts +68 -0
  45. package/dist/core/git.d.ts.map +1 -0
  46. package/dist/core/git.js +148 -0
  47. package/dist/core/git.js.map +1 -0
  48. package/dist/core/hooks.d.ts +37 -0
  49. package/dist/core/hooks.d.ts.map +1 -0
  50. package/dist/core/hooks.js +77 -0
  51. package/dist/core/hooks.js.map +1 -0
  52. package/dist/core/i18n.d.ts +90 -0
  53. package/dist/core/i18n.d.ts.map +1 -0
  54. package/dist/core/i18n.js +253 -0
  55. package/dist/core/i18n.js.map +1 -0
  56. package/dist/core/lsp.d.ts +74 -0
  57. package/dist/core/lsp.d.ts.map +1 -0
  58. package/dist/core/lsp.js +239 -0
  59. package/dist/core/lsp.js.map +1 -0
  60. package/dist/core/mcp.d.ts +49 -0
  61. package/dist/core/mcp.d.ts.map +1 -0
  62. package/dist/core/mcp.js +195 -0
  63. package/dist/core/mcp.js.map +1 -0
  64. package/dist/core/memory.d.ts +38 -0
  65. package/dist/core/memory.d.ts.map +1 -0
  66. package/dist/core/memory.js +231 -0
  67. package/dist/core/memory.js.map +1 -0
  68. package/dist/core/metrics.d.ts +36 -0
  69. package/dist/core/metrics.d.ts.map +1 -0
  70. package/dist/core/metrics.js +111 -0
  71. package/dist/core/metrics.js.map +1 -0
  72. package/dist/core/review.d.ts +27 -0
  73. package/dist/core/review.d.ts.map +1 -0
  74. package/dist/core/review.js +201 -0
  75. package/dist/core/review.js.map +1 -0
  76. package/dist/core/sandbox.d.ts +52 -0
  77. package/dist/core/sandbox.d.ts.map +1 -0
  78. package/dist/core/sandbox.js +140 -0
  79. package/dist/core/sandbox.js.map +1 -0
  80. package/dist/core/scheduler.d.ts +56 -0
  81. package/dist/core/scheduler.d.ts.map +1 -0
  82. package/dist/core/scheduler.js +167 -0
  83. package/dist/core/scheduler.js.map +1 -0
  84. package/dist/core/session.d.ts +49 -0
  85. package/dist/core/session.d.ts.map +1 -0
  86. package/dist/core/session.js +127 -0
  87. package/dist/core/session.js.map +1 -0
  88. package/dist/core/skills.d.ts +36 -0
  89. package/dist/core/skills.d.ts.map +1 -0
  90. package/dist/core/skills.js +90 -0
  91. package/dist/core/skills.js.map +1 -0
  92. package/dist/core/subagent.d.ts +45 -0
  93. package/dist/core/subagent.d.ts.map +1 -0
  94. package/dist/core/subagent.js +130 -0
  95. package/dist/core/subagent.js.map +1 -0
  96. package/dist/core/themes.d.ts +35 -0
  97. package/dist/core/themes.d.ts.map +1 -0
  98. package/dist/core/themes.js +188 -0
  99. package/dist/core/themes.js.map +1 -0
  100. package/dist/tools/bash.d.ts +3 -0
  101. package/dist/tools/bash.d.ts.map +1 -0
  102. package/dist/tools/bash.js +92 -0
  103. package/dist/tools/bash.js.map +1 -0
  104. package/dist/tools/chrome-manager.d.ts +35 -0
  105. package/dist/tools/chrome-manager.d.ts.map +1 -0
  106. package/dist/tools/chrome-manager.js +163 -0
  107. package/dist/tools/chrome-manager.js.map +1 -0
  108. package/dist/tools/chrome.d.ts +78 -0
  109. package/dist/tools/chrome.d.ts.map +1 -0
  110. package/dist/tools/chrome.js +1058 -0
  111. package/dist/tools/chrome.js.map +1 -0
  112. package/dist/tools/edit.d.ts +3 -0
  113. package/dist/tools/edit.d.ts.map +1 -0
  114. package/dist/tools/edit.js +81 -0
  115. package/dist/tools/edit.js.map +1 -0
  116. package/dist/tools/glob.d.ts +3 -0
  117. package/dist/tools/glob.d.ts.map +1 -0
  118. package/dist/tools/glob.js +41 -0
  119. package/dist/tools/glob.js.map +1 -0
  120. package/dist/tools/grep.d.ts +3 -0
  121. package/dist/tools/grep.d.ts.map +1 -0
  122. package/dist/tools/grep.js +74 -0
  123. package/dist/tools/grep.js.map +1 -0
  124. package/dist/tools/path-safety.d.ts +3 -0
  125. package/dist/tools/path-safety.d.ts.map +1 -0
  126. package/dist/tools/path-safety.js +19 -0
  127. package/dist/tools/path-safety.js.map +1 -0
  128. package/dist/tools/read.d.ts +3 -0
  129. package/dist/tools/read.d.ts.map +1 -0
  130. package/dist/tools/read.js +58 -0
  131. package/dist/tools/read.js.map +1 -0
  132. package/dist/tools/registry.d.ts +4 -0
  133. package/dist/tools/registry.d.ts.map +1 -0
  134. package/dist/tools/registry.js +43 -0
  135. package/dist/tools/registry.js.map +1 -0
  136. package/dist/tools/types.d.ts +47 -0
  137. package/dist/tools/types.d.ts.map +1 -0
  138. package/dist/tools/types.js +90 -0
  139. package/dist/tools/types.js.map +1 -0
  140. package/dist/tools/write.d.ts +3 -0
  141. package/dist/tools/write.d.ts.map +1 -0
  142. package/dist/tools/write.js +51 -0
  143. package/dist/tools/write.js.map +1 -0
  144. package/dist/ui/activity-cards.d.ts +50 -0
  145. package/dist/ui/activity-cards.d.ts.map +1 -0
  146. package/dist/ui/activity-cards.js +185 -0
  147. package/dist/ui/activity-cards.js.map +1 -0
  148. package/dist/ui/app.d.ts +9 -0
  149. package/dist/ui/app.d.ts.map +1 -0
  150. package/dist/ui/app.js +852 -0
  151. package/dist/ui/app.js.map +1 -0
  152. package/dist/ui/chat-view.d.ts +10 -0
  153. package/dist/ui/chat-view.d.ts.map +1 -0
  154. package/dist/ui/chat-view.js +94 -0
  155. package/dist/ui/chat-view.js.map +1 -0
  156. package/dist/ui/error-boundary.d.ts +13 -0
  157. package/dist/ui/error-boundary.d.ts.map +1 -0
  158. package/dist/ui/error-boundary.js +16 -0
  159. package/dist/ui/error-boundary.js.map +1 -0
  160. package/dist/ui/fade-in.d.ts +8 -0
  161. package/dist/ui/fade-in.d.ts.map +1 -0
  162. package/dist/ui/fade-in.js +14 -0
  163. package/dist/ui/fade-in.js.map +1 -0
  164. package/dist/ui/input-bar.d.ts +16 -0
  165. package/dist/ui/input-bar.d.ts.map +1 -0
  166. package/dist/ui/input-bar.js +269 -0
  167. package/dist/ui/input-bar.js.map +1 -0
  168. package/dist/ui/markdown-view.d.ts +9 -0
  169. package/dist/ui/markdown-view.d.ts.map +1 -0
  170. package/dist/ui/markdown-view.js +240 -0
  171. package/dist/ui/markdown-view.js.map +1 -0
  172. package/dist/ui/matrix-rain.d.ts +2 -0
  173. package/dist/ui/matrix-rain.d.ts.map +1 -0
  174. package/dist/ui/matrix-rain.js +134 -0
  175. package/dist/ui/matrix-rain.js.map +1 -0
  176. package/dist/ui/reasoning-view.d.ts +12 -0
  177. package/dist/ui/reasoning-view.d.ts.map +1 -0
  178. package/dist/ui/reasoning-view.js +34 -0
  179. package/dist/ui/reasoning-view.js.map +1 -0
  180. package/dist/ui/results-panel.d.ts +11 -0
  181. package/dist/ui/results-panel.d.ts.map +1 -0
  182. package/dist/ui/results-panel.js +17 -0
  183. package/dist/ui/results-panel.js.map +1 -0
  184. package/dist/ui/setup-wizard.d.ts +30 -0
  185. package/dist/ui/setup-wizard.d.ts.map +1 -0
  186. package/dist/ui/setup-wizard.js +166 -0
  187. package/dist/ui/setup-wizard.js.map +1 -0
  188. package/dist/ui/status-bar.d.ts +14 -0
  189. package/dist/ui/status-bar.d.ts.map +1 -0
  190. package/dist/ui/status-bar.js +63 -0
  191. package/dist/ui/status-bar.js.map +1 -0
  192. package/dist/ui/tool-activity-card.d.ts +9 -0
  193. package/dist/ui/tool-activity-card.d.ts.map +1 -0
  194. package/dist/ui/tool-activity-card.js +172 -0
  195. package/dist/ui/tool-activity-card.js.map +1 -0
  196. package/dist/ui/tool-call-view.d.ts +9 -0
  197. package/dist/ui/tool-call-view.d.ts.map +1 -0
  198. package/dist/ui/tool-call-view.js +149 -0
  199. package/dist/ui/tool-call-view.js.map +1 -0
  200. package/dist/utils/clipboard.d.ts +6 -0
  201. package/dist/utils/clipboard.d.ts.map +1 -0
  202. package/dist/utils/clipboard.js +56 -0
  203. package/dist/utils/clipboard.js.map +1 -0
  204. package/dist/utils/ignore.d.ts +6 -0
  205. package/dist/utils/ignore.d.ts.map +1 -0
  206. package/dist/utils/ignore.js +40 -0
  207. package/dist/utils/ignore.js.map +1 -0
  208. package/dist/utils/logger.d.ts +4 -0
  209. package/dist/utils/logger.d.ts.map +1 -0
  210. package/dist/utils/logger.js +13 -0
  211. package/dist/utils/logger.js.map +1 -0
  212. package/dist/utils/string-width.d.ts +6 -0
  213. package/dist/utils/string-width.d.ts.map +1 -0
  214. package/dist/utils/string-width.js +37 -0
  215. package/dist/utils/string-width.js.map +1 -0
  216. 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