@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.
Files changed (118) hide show
  1. package/.cdoing/permissions.json +8 -0
  2. package/dist/callbacks.d.ts +17 -0
  3. package/dist/callbacks.d.ts.map +1 -0
  4. package/dist/callbacks.js +265 -0
  5. package/dist/callbacks.js.map +1 -0
  6. package/dist/chat.d.ts +27 -0
  7. package/dist/chat.d.ts.map +1 -0
  8. package/dist/chat.js +57 -0
  9. package/dist/chat.js.map +1 -0
  10. package/dist/commands.d.ts +22 -0
  11. package/dist/commands.d.ts.map +1 -0
  12. package/dist/commands.js +452 -0
  13. package/dist/commands.js.map +1 -0
  14. package/dist/config.d.ts +84 -0
  15. package/dist/config.d.ts.map +1 -0
  16. package/dist/config.js +427 -0
  17. package/dist/config.js.map +1 -0
  18. package/dist/help.d.ts +9 -0
  19. package/dist/help.d.ts.map +1 -0
  20. package/dist/help.js +167 -0
  21. package/dist/help.js.map +1 -0
  22. package/dist/history.d.ts +51 -0
  23. package/dist/history.d.ts.map +1 -0
  24. package/dist/history.js +207 -0
  25. package/dist/history.js.map +1 -0
  26. package/dist/index.d.ts +7 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +220 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/oauth.d.ts +13 -0
  31. package/dist/oauth.d.ts.map +1 -0
  32. package/dist/oauth.js +182 -0
  33. package/dist/oauth.js.map +1 -0
  34. package/dist/review.d.ts +26 -0
  35. package/dist/review.d.ts.map +1 -0
  36. package/dist/review.js +198 -0
  37. package/dist/review.js.map +1 -0
  38. package/dist/serve.d.ts +23 -0
  39. package/dist/serve.d.ts.map +1 -0
  40. package/dist/serve.js +293 -0
  41. package/dist/serve.js.map +1 -0
  42. package/dist/tools.d.ts +14 -0
  43. package/dist/tools.d.ts.map +1 -0
  44. package/dist/tools.js +57 -0
  45. package/dist/tools.js.map +1 -0
  46. package/dist/ui/App.d.ts +24 -0
  47. package/dist/ui/App.d.ts.map +1 -0
  48. package/dist/ui/App.js +321 -0
  49. package/dist/ui/App.js.map +1 -0
  50. package/dist/ui/MessageList.d.ts +14 -0
  51. package/dist/ui/MessageList.d.ts.map +1 -0
  52. package/dist/ui/MessageList.js +147 -0
  53. package/dist/ui/MessageList.js.map +1 -0
  54. package/dist/ui/SessionBrowser.d.ts +18 -0
  55. package/dist/ui/SessionBrowser.d.ts.map +1 -0
  56. package/dist/ui/SessionBrowser.js +149 -0
  57. package/dist/ui/SessionBrowser.js.map +1 -0
  58. package/dist/ui/SetupWizard.d.ts +23 -0
  59. package/dist/ui/SetupWizard.d.ts.map +1 -0
  60. package/dist/ui/SetupWizard.js +402 -0
  61. package/dist/ui/SetupWizard.js.map +1 -0
  62. package/dist/ui/Spinner.d.ts +15 -0
  63. package/dist/ui/Spinner.d.ts.map +1 -0
  64. package/dist/ui/Spinner.js +111 -0
  65. package/dist/ui/Spinner.js.map +1 -0
  66. package/dist/ui/StatusBar.d.ts +16 -0
  67. package/dist/ui/StatusBar.d.ts.map +1 -0
  68. package/dist/ui/StatusBar.js +56 -0
  69. package/dist/ui/StatusBar.js.map +1 -0
  70. package/dist/ui/UserInput.d.ts +13 -0
  71. package/dist/ui/UserInput.d.ts.map +1 -0
  72. package/dist/ui/UserInput.js +872 -0
  73. package/dist/ui/UserInput.js.map +1 -0
  74. package/dist/ui/hooks/helpers.d.ts +55 -0
  75. package/dist/ui/hooks/helpers.d.ts.map +1 -0
  76. package/dist/ui/hooks/helpers.js +304 -0
  77. package/dist/ui/hooks/helpers.js.map +1 -0
  78. package/dist/ui/hooks/useAgent.d.ts +60 -0
  79. package/dist/ui/hooks/useAgent.d.ts.map +1 -0
  80. package/dist/ui/hooks/useAgent.js +213 -0
  81. package/dist/ui/hooks/useAgent.js.map +1 -0
  82. package/dist/ui/hooks/useChat.d.ts +74 -0
  83. package/dist/ui/hooks/useChat.d.ts.map +1 -0
  84. package/dist/ui/hooks/useChat.js +819 -0
  85. package/dist/ui/hooks/useChat.js.map +1 -0
  86. package/dist/ui/theme.d.ts +73 -0
  87. package/dist/ui/theme.d.ts.map +1 -0
  88. package/dist/ui/theme.js +214 -0
  89. package/dist/ui/theme.js.map +1 -0
  90. package/dist/ui/types.d.ts +37 -0
  91. package/dist/ui/types.d.ts.map +1 -0
  92. package/dist/ui/types.js +3 -0
  93. package/dist/ui/types.js.map +1 -0
  94. package/package.json +33 -0
  95. package/src/callbacks.ts +294 -0
  96. package/src/chat.ts +72 -0
  97. package/src/commands.ts +425 -0
  98. package/src/config.ts +462 -0
  99. package/src/help.ts +182 -0
  100. package/src/history.ts +205 -0
  101. package/src/index.ts +248 -0
  102. package/src/oauth.ts +164 -0
  103. package/src/review.ts +233 -0
  104. package/src/serve.ts +290 -0
  105. package/src/tools.ts +104 -0
  106. package/src/ui/App.tsx +426 -0
  107. package/src/ui/MessageList.tsx +222 -0
  108. package/src/ui/SessionBrowser.tsx +161 -0
  109. package/src/ui/SetupWizard.tsx +412 -0
  110. package/src/ui/Spinner.tsx +103 -0
  111. package/src/ui/StatusBar.tsx +106 -0
  112. package/src/ui/UserInput.tsx +954 -0
  113. package/src/ui/hooks/helpers.ts +271 -0
  114. package/src/ui/hooks/useAgent.ts +270 -0
  115. package/src/ui/hooks/useChat.ts +943 -0
  116. package/src/ui/theme.ts +326 -0
  117. package/src/ui/types.ts +41 -0
  118. 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"}