@cdoing/cli 0.1.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/.cdoing/permissions.json +8 -0
- package/dist/callbacks.d.ts +17 -0
- package/dist/callbacks.d.ts.map +1 -0
- package/dist/callbacks.js +265 -0
- package/dist/callbacks.js.map +1 -0
- package/dist/chat.d.ts +27 -0
- package/dist/chat.d.ts.map +1 -0
- package/dist/chat.js +57 -0
- package/dist/chat.js.map +1 -0
- package/dist/commands.d.ts +22 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +452 -0
- package/dist/commands.js.map +1 -0
- package/dist/config.d.ts +84 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +427 -0
- package/dist/config.js.map +1 -0
- package/dist/help.d.ts +9 -0
- package/dist/help.d.ts.map +1 -0
- package/dist/help.js +167 -0
- package/dist/help.js.map +1 -0
- package/dist/history.d.ts +51 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/history.js +207 -0
- package/dist/history.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +220 -0
- package/dist/index.js.map +1 -0
- package/dist/oauth.d.ts +13 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +182 -0
- package/dist/oauth.js.map +1 -0
- package/dist/review.d.ts +26 -0
- package/dist/review.d.ts.map +1 -0
- package/dist/review.js +198 -0
- package/dist/review.js.map +1 -0
- package/dist/serve.d.ts +23 -0
- package/dist/serve.d.ts.map +1 -0
- package/dist/serve.js +293 -0
- package/dist/serve.js.map +1 -0
- package/dist/tools.d.ts +14 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +57 -0
- package/dist/tools.js.map +1 -0
- package/dist/ui/App.d.ts +24 -0
- package/dist/ui/App.d.ts.map +1 -0
- package/dist/ui/App.js +321 -0
- package/dist/ui/App.js.map +1 -0
- package/dist/ui/MessageList.d.ts +14 -0
- package/dist/ui/MessageList.d.ts.map +1 -0
- package/dist/ui/MessageList.js +147 -0
- package/dist/ui/MessageList.js.map +1 -0
- package/dist/ui/SessionBrowser.d.ts +18 -0
- package/dist/ui/SessionBrowser.d.ts.map +1 -0
- package/dist/ui/SessionBrowser.js +149 -0
- package/dist/ui/SessionBrowser.js.map +1 -0
- package/dist/ui/SetupWizard.d.ts +23 -0
- package/dist/ui/SetupWizard.d.ts.map +1 -0
- package/dist/ui/SetupWizard.js +402 -0
- package/dist/ui/SetupWizard.js.map +1 -0
- package/dist/ui/Spinner.d.ts +15 -0
- package/dist/ui/Spinner.d.ts.map +1 -0
- package/dist/ui/Spinner.js +111 -0
- package/dist/ui/Spinner.js.map +1 -0
- package/dist/ui/StatusBar.d.ts +16 -0
- package/dist/ui/StatusBar.d.ts.map +1 -0
- package/dist/ui/StatusBar.js +56 -0
- package/dist/ui/StatusBar.js.map +1 -0
- package/dist/ui/UserInput.d.ts +13 -0
- package/dist/ui/UserInput.d.ts.map +1 -0
- package/dist/ui/UserInput.js +872 -0
- package/dist/ui/UserInput.js.map +1 -0
- package/dist/ui/hooks/helpers.d.ts +55 -0
- package/dist/ui/hooks/helpers.d.ts.map +1 -0
- package/dist/ui/hooks/helpers.js +304 -0
- package/dist/ui/hooks/helpers.js.map +1 -0
- package/dist/ui/hooks/useAgent.d.ts +60 -0
- package/dist/ui/hooks/useAgent.d.ts.map +1 -0
- package/dist/ui/hooks/useAgent.js +213 -0
- package/dist/ui/hooks/useAgent.js.map +1 -0
- package/dist/ui/hooks/useChat.d.ts +74 -0
- package/dist/ui/hooks/useChat.d.ts.map +1 -0
- package/dist/ui/hooks/useChat.js +819 -0
- package/dist/ui/hooks/useChat.js.map +1 -0
- package/dist/ui/theme.d.ts +73 -0
- package/dist/ui/theme.d.ts.map +1 -0
- package/dist/ui/theme.js +214 -0
- package/dist/ui/theme.js.map +1 -0
- package/dist/ui/types.d.ts +37 -0
- package/dist/ui/types.d.ts.map +1 -0
- package/dist/ui/types.js +3 -0
- package/dist/ui/types.js.map +1 -0
- package/package.json +33 -0
- package/src/callbacks.ts +294 -0
- package/src/chat.ts +72 -0
- package/src/commands.ts +425 -0
- package/src/config.ts +462 -0
- package/src/help.ts +182 -0
- package/src/history.ts +205 -0
- package/src/index.ts +248 -0
- package/src/oauth.ts +164 -0
- package/src/review.ts +233 -0
- package/src/serve.ts +290 -0
- package/src/tools.ts +104 -0
- package/src/ui/App.tsx +426 -0
- package/src/ui/MessageList.tsx +222 -0
- package/src/ui/SessionBrowser.tsx +161 -0
- package/src/ui/SetupWizard.tsx +412 -0
- package/src/ui/Spinner.tsx +103 -0
- package/src/ui/StatusBar.tsx +106 -0
- package/src/ui/UserInput.tsx +954 -0
- package/src/ui/hooks/helpers.ts +271 -0
- package/src/ui/hooks/useAgent.ts +270 -0
- package/src/ui/hooks/useChat.ts +943 -0
- package/src/ui/theme.ts +326 -0
- package/src/ui/types.ts +41 -0
- package/tsconfig.json +18 -0
package/dist/ui/App.js
ADDED
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* App — root Ink component.
|
|
4
|
+
*
|
|
5
|
+
* Key design: past messages are printed directly to stdout (so they scroll
|
|
6
|
+
* naturally above the terminal), while Ink only manages the small, fixed-height
|
|
7
|
+
* bottom section: streaming content + tool activity + input + status bar.
|
|
8
|
+
*
|
|
9
|
+
* This prevents Ink from miscalculating its height on every keypress and
|
|
10
|
+
* scrolling the terminal.
|
|
11
|
+
*/
|
|
12
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
15
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
16
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
17
|
+
}
|
|
18
|
+
Object.defineProperty(o, k2, desc);
|
|
19
|
+
}) : (function(o, m, k, k2) {
|
|
20
|
+
if (k2 === undefined) k2 = k;
|
|
21
|
+
o[k2] = m[k];
|
|
22
|
+
}));
|
|
23
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
24
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
25
|
+
}) : function(o, v) {
|
|
26
|
+
o["default"] = v;
|
|
27
|
+
});
|
|
28
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
29
|
+
var ownKeys = function(o) {
|
|
30
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
31
|
+
var ar = [];
|
|
32
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
33
|
+
return ar;
|
|
34
|
+
};
|
|
35
|
+
return ownKeys(o);
|
|
36
|
+
};
|
|
37
|
+
return function (mod) {
|
|
38
|
+
if (mod && mod.__esModule) return mod;
|
|
39
|
+
var result = {};
|
|
40
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
41
|
+
__setModuleDefault(result, mod);
|
|
42
|
+
return result;
|
|
43
|
+
};
|
|
44
|
+
})();
|
|
45
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
46
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
47
|
+
};
|
|
48
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
49
|
+
exports.App = void 0;
|
|
50
|
+
const react_1 = __importStar(require("react"));
|
|
51
|
+
const ink_1 = require("ink");
|
|
52
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
53
|
+
const MessageList_1 = require("./MessageList");
|
|
54
|
+
const Spinner_1 = require("./Spinner");
|
|
55
|
+
const UserInput_1 = require("./UserInput");
|
|
56
|
+
const StatusBar_1 = require("./StatusBar");
|
|
57
|
+
const SessionBrowser_1 = require("./SessionBrowser");
|
|
58
|
+
const SetupWizard_1 = require("./SetupWizard");
|
|
59
|
+
const useChat_1 = require("./hooks/useChat");
|
|
60
|
+
const theme_1 = require("./theme");
|
|
61
|
+
// ── Static message renderer ─────────────────────────────────────────────────
|
|
62
|
+
function renderStaticMessage(msg) {
|
|
63
|
+
const t = (0, theme_1.getTheme)();
|
|
64
|
+
switch (msg.role) {
|
|
65
|
+
case "user":
|
|
66
|
+
return (react_1.default.createElement(ink_1.Box, { key: msg.id, flexDirection: "column" },
|
|
67
|
+
react_1.default.createElement(ink_1.Text, null, " "),
|
|
68
|
+
react_1.default.createElement(ink_1.Box, null,
|
|
69
|
+
react_1.default.createElement(ink_1.Text, { color: t.prompt, bold: true }, "❯ "),
|
|
70
|
+
react_1.default.createElement(ink_1.Text, { color: t.text }, msg.content))));
|
|
71
|
+
case "assistant":
|
|
72
|
+
return (react_1.default.createElement(ink_1.Box, { key: msg.id, flexDirection: "column" },
|
|
73
|
+
react_1.default.createElement(ink_1.Text, null, " "),
|
|
74
|
+
react_1.default.createElement(ink_1.Text, null, msg.content),
|
|
75
|
+
react_1.default.createElement(ink_1.Text, { color: t.separator }, "─".repeat(process.stdout.columns > 0 ? Math.min(process.stdout.columns, 60) : 40))));
|
|
76
|
+
case "system":
|
|
77
|
+
return (react_1.default.createElement(ink_1.Box, { key: msg.id },
|
|
78
|
+
msg.isError ? react_1.default.createElement(ink_1.Text, { color: t.error }, " ❌ ") : react_1.default.createElement(ink_1.Text, { color: t.info }, " ▸ "),
|
|
79
|
+
react_1.default.createElement(ink_1.Text, null, msg.content)));
|
|
80
|
+
case "shell":
|
|
81
|
+
return react_1.default.createElement(ink_1.Text, { key: msg.id }, msg.content.trimEnd());
|
|
82
|
+
default:
|
|
83
|
+
return react_1.default.createElement(ink_1.Text, { key: msg.id }, msg.content);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const App = ({ modelConfig, toolRegistry, permissionManager, hookManager, memoryStore, todoStore, initialPrompt, }) => {
|
|
87
|
+
const { exit } = (0, ink_1.useApp)();
|
|
88
|
+
const processingStartRef = (0, react_1.useRef)(null);
|
|
89
|
+
// Track background shell processes so Ctrl+C can kill them
|
|
90
|
+
const bgProcessRef = (0, react_1.useRef)(null);
|
|
91
|
+
// Live shell command output (streams in dynamic area, flushed to Static on complete)
|
|
92
|
+
const [shellLive, setShellLive] = (0, react_1.useState)("");
|
|
93
|
+
const shellLiveRef = (0, react_1.useRef)("");
|
|
94
|
+
const [showSetupWizard, setShowSetupWizard] = (0, react_1.useState)(false);
|
|
95
|
+
const { messages, setMessages, streamingContent, isProcessing, toolActivity, lastUsage, workingDir, contextUsage, backgroundJobs, showSessionBrowser, setShowSessionBrowser, conversations, sendMessage, handleSlashCommand, cancelCurrent, addSystemMessage, modelConfig: liveModelConfig, } = (0, useChat_1.useChat)({
|
|
96
|
+
modelConfig,
|
|
97
|
+
toolRegistry,
|
|
98
|
+
permissionManager,
|
|
99
|
+
hookManager,
|
|
100
|
+
memoryStore,
|
|
101
|
+
todoStore,
|
|
102
|
+
});
|
|
103
|
+
// Track when processing starts for the elapsed timer
|
|
104
|
+
(0, react_1.useEffect)(() => {
|
|
105
|
+
if (isProcessing && processingStartRef.current === null) {
|
|
106
|
+
processingStartRef.current = Date.now();
|
|
107
|
+
}
|
|
108
|
+
else if (!isProcessing) {
|
|
109
|
+
processingStartRef.current = null;
|
|
110
|
+
}
|
|
111
|
+
}, [isProcessing]);
|
|
112
|
+
// Clear terminal when /clear resets the messages array
|
|
113
|
+
const prevMsgLenRef = (0, react_1.useRef)(0);
|
|
114
|
+
(0, react_1.useEffect)(() => {
|
|
115
|
+
if (messages.length === 0 && prevMsgLenRef.current > 0) {
|
|
116
|
+
process.stdout.write("\x1b[2J\x1b[H");
|
|
117
|
+
}
|
|
118
|
+
prevMsgLenRef.current = messages.length;
|
|
119
|
+
}, [messages.length]);
|
|
120
|
+
// Send initial prompt on mount
|
|
121
|
+
(0, react_1.useEffect)(() => {
|
|
122
|
+
if (initialPrompt) {
|
|
123
|
+
sendMessage(initialPrompt);
|
|
124
|
+
}
|
|
125
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
126
|
+
}, []);
|
|
127
|
+
// Ctrl+C: kill bg process if running, otherwise double-tap to exit
|
|
128
|
+
const ctrlCRef = (0, react_1.useRef)(0);
|
|
129
|
+
(0, react_1.useEffect)(() => {
|
|
130
|
+
const handler = () => {
|
|
131
|
+
// If a background shell process is running, kill it
|
|
132
|
+
if (bgProcessRef.current) {
|
|
133
|
+
bgProcessRef.current.kill("SIGINT");
|
|
134
|
+
bgProcessRef.current = null;
|
|
135
|
+
process.stdout.write(chalk_1.default.yellow("\n[process killed]\n"));
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
const now = Date.now();
|
|
139
|
+
if (now - ctrlCRef.current < 1000) {
|
|
140
|
+
exit();
|
|
141
|
+
process.exit(0);
|
|
142
|
+
}
|
|
143
|
+
ctrlCRef.current = now;
|
|
144
|
+
process.stdout.write(chalk_1.default.gray("Press Ctrl+C again to exit, or type /exit.\n"));
|
|
145
|
+
};
|
|
146
|
+
process.on("SIGINT", handler);
|
|
147
|
+
return () => { process.off("SIGINT", handler); };
|
|
148
|
+
}, [exit]);
|
|
149
|
+
const handleSubmit = (0, react_1.useCallback)(async (value) => {
|
|
150
|
+
if (!value.trim())
|
|
151
|
+
return;
|
|
152
|
+
// Determine the raw shell command — either explicit `!cmd` or auto-detected
|
|
153
|
+
const shellCmd = value.startsWith("!")
|
|
154
|
+
? value.slice(1).trim()
|
|
155
|
+
: detectShellCommand(value);
|
|
156
|
+
if (shellCmd !== null) {
|
|
157
|
+
// Intercept `cd` — exec can't change the parent process directory
|
|
158
|
+
if (shellCmd === "cd" || shellCmd.startsWith("cd ") || shellCmd.startsWith("cd\t")) {
|
|
159
|
+
const target = shellCmd.slice(2).trim() || process.env.HOME || "/";
|
|
160
|
+
const result = await handleSlashCommand(`/dir ${target}`);
|
|
161
|
+
if (result !== null) {
|
|
162
|
+
process.stdout.write(chalk_1.default.gray(`$ ${shellCmd}`) + "\n" + (result ? chalk_1.default.white(result) + "\n" : ""));
|
|
163
|
+
}
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
// Interactive commands (vim, nano, less…) need full TTY — use spawnSync
|
|
167
|
+
if (isInteractiveCommand(shellCmd)) {
|
|
168
|
+
const { spawnSync } = require("child_process");
|
|
169
|
+
const parts = shellCmd.match(/(?:[^\s"']+|"[^"]*"|'[^']*')+/g) || [shellCmd];
|
|
170
|
+
const [bin, ...args] = parts;
|
|
171
|
+
// Let the subprocess own the terminal completely
|
|
172
|
+
spawnSync(bin, args, { stdio: "inherit", cwd: workingDir, env: { ...process.env } });
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
// All other shell commands — stream live in dynamic area, flush to Static on done
|
|
176
|
+
{
|
|
177
|
+
const { spawn } = require("child_process");
|
|
178
|
+
addSystemMessage(`$ ${shellCmd}`);
|
|
179
|
+
shellLiveRef.current = "";
|
|
180
|
+
setShellLive("");
|
|
181
|
+
const child = spawn(shellCmd, [], {
|
|
182
|
+
shell: true,
|
|
183
|
+
cwd: workingDir,
|
|
184
|
+
env: { ...process.env },
|
|
185
|
+
});
|
|
186
|
+
bgProcessRef.current = child;
|
|
187
|
+
const onData = (chunk) => {
|
|
188
|
+
shellLiveRef.current += chunk.toString();
|
|
189
|
+
setShellLive(shellLiveRef.current);
|
|
190
|
+
};
|
|
191
|
+
child.stdout?.on("data", onData);
|
|
192
|
+
child.stderr?.on("data", onData);
|
|
193
|
+
child.on("close", (code) => {
|
|
194
|
+
bgProcessRef.current = null;
|
|
195
|
+
const output = shellLiveRef.current;
|
|
196
|
+
shellLiveRef.current = "";
|
|
197
|
+
setShellLive("");
|
|
198
|
+
if (output.trim()) {
|
|
199
|
+
setMessages((prev) => [
|
|
200
|
+
...prev,
|
|
201
|
+
{ id: String(Date.now()), role: "shell", content: output.trimEnd() },
|
|
202
|
+
]);
|
|
203
|
+
}
|
|
204
|
+
if (code !== null && code !== 0) {
|
|
205
|
+
addSystemMessage(chalk_1.default.red(`[exited with code ${code}]`));
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
child.on("error", (err) => {
|
|
209
|
+
bgProcessRef.current = null;
|
|
210
|
+
shellLiveRef.current = "";
|
|
211
|
+
setShellLive("");
|
|
212
|
+
addSystemMessage(chalk_1.default.red(`[error: ${err.message}]`));
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
if (value.startsWith("/")) {
|
|
218
|
+
if (value.trim() === "/setup") {
|
|
219
|
+
setShowSetupWizard(true);
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
const result = await handleSlashCommand(value);
|
|
223
|
+
if (result !== null) {
|
|
224
|
+
addSystemMessage(result);
|
|
225
|
+
}
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
await sendMessage(value);
|
|
229
|
+
}, [workingDir, handleSlashCommand, sendMessage, addSystemMessage]);
|
|
230
|
+
const runningJobs = backgroundJobs.filter((j) => j.status === "running").length;
|
|
231
|
+
// ── Setup wizard overlay ─────────────────────────────────────────────────
|
|
232
|
+
if (showSetupWizard) {
|
|
233
|
+
return (react_1.default.createElement(ink_1.Box, { flexDirection: "column" },
|
|
234
|
+
react_1.default.createElement(SetupWizard_1.SetupWizard, { currentProvider: String(liveModelConfig.provider || "anthropic"), currentModel: String(liveModelConfig.model || ""), onDone: ({ provider, model, apiKey, oauthToken }) => {
|
|
235
|
+
setShowSetupWizard(false);
|
|
236
|
+
handleSlashCommand(`/provider ${provider}`);
|
|
237
|
+
if (model)
|
|
238
|
+
handleSlashCommand(`/model ${model}`);
|
|
239
|
+
if (apiKey)
|
|
240
|
+
handleSlashCommand(`/config set api-key ${apiKey}`);
|
|
241
|
+
if (oauthToken)
|
|
242
|
+
handleSlashCommand(`/config set oauth-token ${oauthToken}`);
|
|
243
|
+
const authNote = oauthToken ? "OAuth ✓" : apiKey ? "API key ✓" : "no key";
|
|
244
|
+
addSystemMessage(`✓ Setup saved — provider: ${provider} model: ${model || "default"} auth: ${authNote}`);
|
|
245
|
+
}, onCancel: () => {
|
|
246
|
+
setShowSetupWizard(false);
|
|
247
|
+
addSystemMessage("Setup cancelled.");
|
|
248
|
+
} })));
|
|
249
|
+
}
|
|
250
|
+
// ── Session browser overlay ──────────────────────────────────────────────
|
|
251
|
+
if (showSessionBrowser) {
|
|
252
|
+
const convList = conversations();
|
|
253
|
+
return (react_1.default.createElement(ink_1.Box, { flexDirection: "column" },
|
|
254
|
+
react_1.default.createElement(SessionBrowser_1.SessionBrowser, { conversations: convList, onSelect: async (id) => {
|
|
255
|
+
setShowSessionBrowser(false);
|
|
256
|
+
const result = await handleSlashCommand(`/resume ${id}`);
|
|
257
|
+
if (result)
|
|
258
|
+
addSystemMessage(result);
|
|
259
|
+
}, onDelete: async (id) => {
|
|
260
|
+
await handleSlashCommand(`/delete ${id}`);
|
|
261
|
+
}, onFork: async (id) => {
|
|
262
|
+
setShowSessionBrowser(false);
|
|
263
|
+
const result = await handleSlashCommand(`/fork ${id}`);
|
|
264
|
+
if (result)
|
|
265
|
+
addSystemMessage(result);
|
|
266
|
+
}, onClose: () => setShowSessionBrowser(false) })));
|
|
267
|
+
}
|
|
268
|
+
// Ink only renders this small fixed section — no scrolling issues
|
|
269
|
+
return (react_1.default.createElement(ink_1.Box, { flexDirection: "column" },
|
|
270
|
+
react_1.default.createElement(ink_1.Static, { items: messages }, (msg) => renderStaticMessage(msg)),
|
|
271
|
+
shellLive ? react_1.default.createElement(ink_1.Text, null, shellLive.trimEnd()) : null,
|
|
272
|
+
toolActivity ? (react_1.default.createElement(Spinner_1.ToolSpinner, { name: toolActivity.name, preview: toolActivity.preview, status: toolActivity.status })) : null,
|
|
273
|
+
streamingContent ? react_1.default.createElement(MessageList_1.StreamingMessage, { content: streamingContent }) : null,
|
|
274
|
+
isProcessing && !streamingContent && !toolActivity ? (react_1.default.createElement(Spinner_1.Spinner, { label: "Thinking\u2026", startTime: processingStartRef.current ?? undefined })) : null,
|
|
275
|
+
react_1.default.createElement(UserInput_1.UserInput, { isProcessing: isProcessing, queueLength: 0, workingDir: workingDir, permissionMode: permissionManager.getMode(), onSubmit: handleSubmit, onCancel: cancelCurrent, onModeChange: (mode) => {
|
|
276
|
+
const { parsePermissionMode } = require("../config");
|
|
277
|
+
permissionManager.setMode(parsePermissionMode(mode));
|
|
278
|
+
} }),
|
|
279
|
+
react_1.default.createElement(StatusBar_1.StatusBar, { provider: String(liveModelConfig.provider || "anthropic"), model: String(liveModelConfig.model || ""), mode: permissionManager.getMode(), workingDir: workingDir, isProcessing: isProcessing, lastUsage: lastUsage, queueLength: 0, contextUsage: contextUsage, backgroundJobs: runningJobs })));
|
|
280
|
+
};
|
|
281
|
+
exports.App = App;
|
|
282
|
+
// ── Shell command auto-detection ────────────────────────────────────────────
|
|
283
|
+
// Commands that run non-interactively (exec is fine)
|
|
284
|
+
const SHELL_COMMANDS = new Set([
|
|
285
|
+
"ls", "ll", "la", "pwd", "cd", "mkdir", "rmdir", "rm", "cp", "mv",
|
|
286
|
+
"cat", "head", "tail", "touch", "echo", "env",
|
|
287
|
+
"git", "npm", "yarn", "pnpm", "npx", "node", "ts-node",
|
|
288
|
+
"python", "python3", "pip", "pip3",
|
|
289
|
+
"docker", "docker-compose",
|
|
290
|
+
"grep", "find", "which", "whereis",
|
|
291
|
+
"curl", "wget",
|
|
292
|
+
"chmod", "chown", "ln",
|
|
293
|
+
"ps", "kill", "df", "du",
|
|
294
|
+
"open", "code",
|
|
295
|
+
// interactive ones below are handled separately
|
|
296
|
+
"vim", "vi", "nano", "less", "more", "man", "top", "htop",
|
|
297
|
+
]);
|
|
298
|
+
// Commands that require full TTY control — spawned with stdio:'inherit'
|
|
299
|
+
const INTERACTIVE_COMMANDS = new Set([
|
|
300
|
+
"vim", "vi", "nvim", "nano", "pico",
|
|
301
|
+
"less", "more", "man", "info",
|
|
302
|
+
"top", "htop", "btop",
|
|
303
|
+
"ssh", "fzf", "ranger", "mc",
|
|
304
|
+
]);
|
|
305
|
+
/** Returns the command string if input looks like a shell command, else null. */
|
|
306
|
+
function detectShellCommand(input) {
|
|
307
|
+
const trimmed = input.trim();
|
|
308
|
+
const firstWord = trimmed.split(/\s+/)[0].toLowerCase();
|
|
309
|
+
return SHELL_COMMANDS.has(firstWord) ? trimmed : null;
|
|
310
|
+
}
|
|
311
|
+
// Dev server / watcher patterns — need a real TTY so their UI renders correctly
|
|
312
|
+
const SERVER_PATTERNS = /\b(run\s+(dev|start|serve|watch|preview)|nodemon|ts-node-dev|live-server|concurrently|turbo\s+dev|next\s+dev|vite|astro\s+dev|nuxt\s+dev|remix\s+dev)\b/i;
|
|
313
|
+
/** Returns true if this command needs full TTY (vim, nano, less, dev servers…). */
|
|
314
|
+
function isInteractiveCommand(cmd) {
|
|
315
|
+
const firstWord = cmd.trim().split(/\s+/)[0].toLowerCase();
|
|
316
|
+
if (INTERACTIVE_COMMANDS.has(firstWord))
|
|
317
|
+
return true;
|
|
318
|
+
// Dev servers / watchers: need real TTY so their dashboard/colors work correctly
|
|
319
|
+
return SERVER_PATTERNS.test(cmd);
|
|
320
|
+
}
|
|
321
|
+
//# sourceMappingURL=App.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"App.js","sourceRoot":"","sources":["../../src/ui/App.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { ChatMessage, ToolActivity } from "./types";
|
|
3
|
+
export declare const StreamingMessage: React.FC<{
|
|
4
|
+
content: string;
|
|
5
|
+
}>;
|
|
6
|
+
export declare const ToolActivityBar: React.FC<{
|
|
7
|
+
tool: ToolActivity;
|
|
8
|
+
}>;
|
|
9
|
+
interface MessageListProps {
|
|
10
|
+
messages: ChatMessage[];
|
|
11
|
+
}
|
|
12
|
+
export declare const MessageList: React.FC<MessageListProps>;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=MessageList.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageList.d.ts","sourceRoot":"","sources":["../../src/ui/MessageList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AA4JzD,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAW1D,CAAC;AAIF,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,CAqB5D,CAAC;AAIF,UAAU,gBAAgB;IACxB,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAmBlD,CAAC"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.MessageList = exports.ToolActivityBar = exports.StreamingMessage = void 0;
|
|
7
|
+
const react_1 = __importDefault(require("react"));
|
|
8
|
+
const ink_1 = require("ink");
|
|
9
|
+
const theme_1 = require("./theme");
|
|
10
|
+
// ── Tool icons ─────────────────────────────────────────────────────────────
|
|
11
|
+
const TOOL_ICONS = {
|
|
12
|
+
file_read: "📖",
|
|
13
|
+
file_write: "✏️ ",
|
|
14
|
+
file_edit: "🔧",
|
|
15
|
+
multi_edit: "🔧",
|
|
16
|
+
file_delete: "🗑️",
|
|
17
|
+
ast_edit: "🌳",
|
|
18
|
+
notebook_edit: "📓",
|
|
19
|
+
glob_search: "🔍",
|
|
20
|
+
grep_search: "🔎",
|
|
21
|
+
codebase_search: "🔎",
|
|
22
|
+
shell_exec: "💻",
|
|
23
|
+
file_run: "▶",
|
|
24
|
+
web_fetch: "🌐",
|
|
25
|
+
web_search: "🔮",
|
|
26
|
+
sub_agent: "🤖",
|
|
27
|
+
todo: "📋",
|
|
28
|
+
list_dir: "📁",
|
|
29
|
+
view_diff: "📊",
|
|
30
|
+
view_repo_map: "🗺️",
|
|
31
|
+
code_verify: "✅",
|
|
32
|
+
system_info: "ℹ️",
|
|
33
|
+
};
|
|
34
|
+
function toolIcon(name) {
|
|
35
|
+
return TOOL_ICONS[name] || "⚡";
|
|
36
|
+
}
|
|
37
|
+
// ── Individual message renderers ────────────────────────────────────────────
|
|
38
|
+
const UserMessage = ({ content }) => {
|
|
39
|
+
const t = (0, theme_1.getTheme)();
|
|
40
|
+
return (react_1.default.createElement(ink_1.Box, { marginY: 0, flexDirection: "row" },
|
|
41
|
+
react_1.default.createElement(ink_1.Text, { color: t.prompt, bold: true }, "❯ "),
|
|
42
|
+
react_1.default.createElement(ink_1.Text, { color: t.text }, content)));
|
|
43
|
+
};
|
|
44
|
+
const AssistantMessage = ({ content }) => {
|
|
45
|
+
const t = (0, theme_1.getTheme)();
|
|
46
|
+
return (react_1.default.createElement(ink_1.Box, { flexDirection: "column", marginTop: 1, paddingLeft: 2 },
|
|
47
|
+
react_1.default.createElement(RenderMarkdown, { text: content }),
|
|
48
|
+
react_1.default.createElement(ink_1.Box, { marginTop: 0 },
|
|
49
|
+
react_1.default.createElement(ink_1.Text, { color: t.separator }, "─".repeat(40)))));
|
|
50
|
+
};
|
|
51
|
+
const SystemMessage = ({ content, isError, }) => {
|
|
52
|
+
const t = (0, theme_1.getTheme)();
|
|
53
|
+
return (react_1.default.createElement(ink_1.Box, { marginY: 0, paddingLeft: 2 },
|
|
54
|
+
react_1.default.createElement(ink_1.Text, { color: isError ? t.error : t.info }, content)));
|
|
55
|
+
};
|
|
56
|
+
// ── Simple inline markdown renderer ────────────────────────────────────────
|
|
57
|
+
const RenderMarkdown = ({ text }) => {
|
|
58
|
+
const t = (0, theme_1.getTheme)();
|
|
59
|
+
const lines = text.split("\n");
|
|
60
|
+
return (react_1.default.createElement(ink_1.Box, { flexDirection: "column" }, lines.map((line, i) => {
|
|
61
|
+
// Code block fence
|
|
62
|
+
if (line.startsWith("```")) {
|
|
63
|
+
return (react_1.default.createElement(ink_1.Text, { key: i, color: t.codeBlock }, line));
|
|
64
|
+
}
|
|
65
|
+
// Headers
|
|
66
|
+
if (line.startsWith("### ")) {
|
|
67
|
+
return (react_1.default.createElement(ink_1.Text, { key: i, color: t.heading2, bold: true },
|
|
68
|
+
" ▸ ",
|
|
69
|
+
line.slice(4)));
|
|
70
|
+
}
|
|
71
|
+
if (line.startsWith("## ")) {
|
|
72
|
+
return (react_1.default.createElement(ink_1.Text, { key: i, color: t.heading2, bold: true },
|
|
73
|
+
" ▸▸ ",
|
|
74
|
+
line.slice(3)));
|
|
75
|
+
}
|
|
76
|
+
if (line.startsWith("# ")) {
|
|
77
|
+
return (react_1.default.createElement(ink_1.Text, { key: i, color: t.heading1, bold: true },
|
|
78
|
+
"▸▸▸ ",
|
|
79
|
+
line.slice(2)));
|
|
80
|
+
}
|
|
81
|
+
// Bullet
|
|
82
|
+
if (line.match(/^(\s*)[-*] /)) {
|
|
83
|
+
const indent = line.match(/^(\s*)/)?.[1] || "";
|
|
84
|
+
const content = line.replace(/^(\s*)[-*] /, "");
|
|
85
|
+
return (react_1.default.createElement(ink_1.Text, { key: i },
|
|
86
|
+
indent,
|
|
87
|
+
react_1.default.createElement(ink_1.Text, { color: t.bullet }, "● "),
|
|
88
|
+
content));
|
|
89
|
+
}
|
|
90
|
+
// Numbered list
|
|
91
|
+
const numMatch = line.match(/^(\s*)(\d+)\. (.*)/);
|
|
92
|
+
if (numMatch) {
|
|
93
|
+
return (react_1.default.createElement(ink_1.Text, { key: i },
|
|
94
|
+
numMatch[1],
|
|
95
|
+
react_1.default.createElement(ink_1.Text, { color: t.listNumber }, numMatch[2] + ". "),
|
|
96
|
+
numMatch[3]));
|
|
97
|
+
}
|
|
98
|
+
// Horizontal rule
|
|
99
|
+
if (line.match(/^---+$/)) {
|
|
100
|
+
return (react_1.default.createElement(ink_1.Text, { key: i, color: t.horizontalRule }, "═".repeat(40)));
|
|
101
|
+
}
|
|
102
|
+
// Plain line
|
|
103
|
+
const cleaned = line
|
|
104
|
+
.replace(/\*\*([^*]+)\*\*/g, "$1")
|
|
105
|
+
.replace(/\*([^*]+)\*/g, "$1")
|
|
106
|
+
.replace(/`([^`]+)`/g, "$1");
|
|
107
|
+
return react_1.default.createElement(ink_1.Text, { key: i }, cleaned);
|
|
108
|
+
})));
|
|
109
|
+
};
|
|
110
|
+
// ── Streaming message (live, mutable) ──────────────────────────────────────
|
|
111
|
+
const StreamingMessage = ({ content, }) => {
|
|
112
|
+
const t = (0, theme_1.getTheme)();
|
|
113
|
+
if (!content)
|
|
114
|
+
return null;
|
|
115
|
+
return (react_1.default.createElement(ink_1.Box, { flexDirection: "column", paddingLeft: 2, marginTop: 1 },
|
|
116
|
+
react_1.default.createElement(RenderMarkdown, { text: content }),
|
|
117
|
+
react_1.default.createElement(ink_1.Text, { color: t.accent }, "▊")));
|
|
118
|
+
};
|
|
119
|
+
exports.StreamingMessage = StreamingMessage;
|
|
120
|
+
// ── Tool activity bar ───────────────────────────────────────────────────────
|
|
121
|
+
const ToolActivityBar = ({ tool, }) => {
|
|
122
|
+
const t = (0, theme_1.getTheme)();
|
|
123
|
+
const icon = toolIcon(tool.name);
|
|
124
|
+
const color = tool.status === "error"
|
|
125
|
+
? t.toolError
|
|
126
|
+
: tool.status === "done"
|
|
127
|
+
? t.toolDone
|
|
128
|
+
: t.toolRunning;
|
|
129
|
+
const statusChar = tool.status === "error" ? "✗" : tool.status === "done" ? "✓" : "…";
|
|
130
|
+
return (react_1.default.createElement(ink_1.Box, { paddingLeft: 2 },
|
|
131
|
+
react_1.default.createElement(ink_1.Text, { color: color },
|
|
132
|
+
`${statusChar} ${icon} ${tool.name}`,
|
|
133
|
+
react_1.default.createElement(ink_1.Text, { color: t.toolPreview }, tool.preview ? ` ${tool.preview}` : ""))));
|
|
134
|
+
};
|
|
135
|
+
exports.ToolActivityBar = ToolActivityBar;
|
|
136
|
+
const MessageList = ({ messages }) => (react_1.default.createElement(ink_1.Static, { items: messages }, (msg) => {
|
|
137
|
+
switch (msg.role) {
|
|
138
|
+
case "user":
|
|
139
|
+
return react_1.default.createElement(UserMessage, { key: msg.id, content: msg.content });
|
|
140
|
+
case "assistant":
|
|
141
|
+
return react_1.default.createElement(AssistantMessage, { key: msg.id, content: msg.content });
|
|
142
|
+
default:
|
|
143
|
+
return (react_1.default.createElement(SystemMessage, { key: msg.id, content: msg.content, isError: msg.isError }));
|
|
144
|
+
}
|
|
145
|
+
}));
|
|
146
|
+
exports.MessageList = MessageList;
|
|
147
|
+
//# sourceMappingURL=MessageList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageList.js","sourceRoot":"","sources":["../../src/ui/MessageList.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SessionBrowser — Interactive TUI for browsing and selecting conversations.
|
|
3
|
+
*
|
|
4
|
+
* Triggered by /ls in chat or `cdoing ls` CLI command.
|
|
5
|
+
* Arrow keys to navigate, Enter to load, d to delete, f to fork, Esc to close.
|
|
6
|
+
*/
|
|
7
|
+
import React from "react";
|
|
8
|
+
import type { Conversation } from "../history";
|
|
9
|
+
interface SessionBrowserProps {
|
|
10
|
+
conversations: Conversation[];
|
|
11
|
+
onSelect: (id: string) => void;
|
|
12
|
+
onDelete: (id: string) => void;
|
|
13
|
+
onFork: (id: string) => void;
|
|
14
|
+
onClose: () => void;
|
|
15
|
+
}
|
|
16
|
+
export declare const SessionBrowser: React.FC<SessionBrowserProps>;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=SessionBrowser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionBrowser.d.ts","sourceRoot":"","sources":["../../src/ui/SessionBrowser.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAgC,MAAM,OAAO,CAAC;AAErD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,UAAU,mBAAmB;IAC3B,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAiBD,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CA6HxD,CAAC"}
|