wave-code 0.0.4 → 0.0.6

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 (102) hide show
  1. package/README.md +2 -2
  2. package/dist/components/ChatInterface.d.ts.map +1 -1
  3. package/dist/components/ChatInterface.js +4 -24
  4. package/dist/components/CommandSelector.js +4 -4
  5. package/dist/components/DiffViewer.d.ts +1 -1
  6. package/dist/components/DiffViewer.d.ts.map +1 -1
  7. package/dist/components/DiffViewer.js +15 -15
  8. package/dist/components/FileSelector.js +2 -2
  9. package/dist/components/InputBox.d.ts.map +1 -1
  10. package/dist/components/InputBox.js +46 -101
  11. package/dist/components/Markdown.d.ts +6 -0
  12. package/dist/components/Markdown.d.ts.map +1 -0
  13. package/dist/components/Markdown.js +22 -0
  14. package/dist/components/MessageItem.d.ts +9 -0
  15. package/dist/components/MessageItem.d.ts.map +1 -0
  16. package/dist/components/MessageItem.js +15 -0
  17. package/dist/components/MessageList.d.ts +1 -1
  18. package/dist/components/MessageList.d.ts.map +1 -1
  19. package/dist/components/MessageList.js +33 -32
  20. package/dist/components/SubagentBlock.d.ts +1 -2
  21. package/dist/components/SubagentBlock.d.ts.map +1 -1
  22. package/dist/components/SubagentBlock.js +29 -20
  23. package/dist/components/ToolResultDisplay.js +5 -5
  24. package/dist/contexts/useChat.d.ts +1 -0
  25. package/dist/contexts/useChat.d.ts.map +1 -1
  26. package/dist/contexts/useChat.js +29 -2
  27. package/dist/hooks/useInputManager.d.ts +93 -0
  28. package/dist/hooks/useInputManager.d.ts.map +1 -0
  29. package/dist/hooks/useInputManager.js +332 -0
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +17 -10
  32. package/dist/managers/InputManager.d.ts +171 -0
  33. package/dist/managers/InputManager.d.ts.map +1 -0
  34. package/dist/managers/InputManager.js +826 -0
  35. package/dist/print-cli.d.ts +8 -0
  36. package/dist/print-cli.d.ts.map +1 -0
  37. package/dist/print-cli.js +128 -0
  38. package/dist/utils/constants.d.ts +1 -1
  39. package/dist/utils/constants.js +1 -1
  40. package/dist/utils/fileSearch.d.ts +20 -0
  41. package/dist/utils/fileSearch.d.ts.map +1 -0
  42. package/dist/utils/fileSearch.js +102 -0
  43. package/dist/utils/logger.js +3 -3
  44. package/dist/utils/usageSummary.d.ts +33 -0
  45. package/dist/utils/usageSummary.d.ts.map +1 -0
  46. package/dist/utils/usageSummary.js +154 -0
  47. package/package.json +10 -6
  48. package/src/components/ChatInterface.tsx +13 -43
  49. package/src/components/CommandSelector.tsx +5 -5
  50. package/src/components/DiffViewer.tsx +18 -16
  51. package/src/components/FileSelector.tsx +2 -2
  52. package/src/components/InputBox.tsx +78 -169
  53. package/src/components/Markdown.tsx +29 -0
  54. package/src/components/MessageItem.tsx +104 -0
  55. package/src/components/MessageList.tsx +142 -198
  56. package/src/components/SubagentBlock.tsx +56 -73
  57. package/src/components/ToolResultDisplay.tsx +6 -6
  58. package/src/contexts/useChat.tsx +34 -2
  59. package/src/hooks/useInputManager.ts +461 -0
  60. package/src/index.ts +20 -10
  61. package/src/managers/InputManager.ts +1132 -0
  62. package/src/print-cli.ts +160 -0
  63. package/src/utils/constants.ts +1 -1
  64. package/src/utils/fileSearch.ts +133 -0
  65. package/src/utils/logger.ts +3 -3
  66. package/src/utils/usageSummary.ts +234 -0
  67. package/dist/hooks/useBashHistorySelector.d.ts +0 -15
  68. package/dist/hooks/useBashHistorySelector.d.ts.map +0 -1
  69. package/dist/hooks/useBashHistorySelector.js +0 -61
  70. package/dist/hooks/useCommandSelector.d.ts +0 -24
  71. package/dist/hooks/useCommandSelector.d.ts.map +0 -1
  72. package/dist/hooks/useCommandSelector.js +0 -98
  73. package/dist/hooks/useFileSelector.d.ts +0 -16
  74. package/dist/hooks/useFileSelector.d.ts.map +0 -1
  75. package/dist/hooks/useFileSelector.js +0 -174
  76. package/dist/hooks/useImageManager.d.ts +0 -13
  77. package/dist/hooks/useImageManager.d.ts.map +0 -1
  78. package/dist/hooks/useImageManager.js +0 -46
  79. package/dist/hooks/useInputHistory.d.ts +0 -11
  80. package/dist/hooks/useInputHistory.d.ts.map +0 -1
  81. package/dist/hooks/useInputHistory.js +0 -64
  82. package/dist/hooks/useInputKeyboardHandler.d.ts +0 -83
  83. package/dist/hooks/useInputKeyboardHandler.d.ts.map +0 -1
  84. package/dist/hooks/useInputKeyboardHandler.js +0 -507
  85. package/dist/hooks/useInputState.d.ts +0 -14
  86. package/dist/hooks/useInputState.d.ts.map +0 -1
  87. package/dist/hooks/useInputState.js +0 -57
  88. package/dist/hooks/useMemoryTypeSelector.d.ts +0 -9
  89. package/dist/hooks/useMemoryTypeSelector.d.ts.map +0 -1
  90. package/dist/hooks/useMemoryTypeSelector.js +0 -27
  91. package/dist/plain-cli.d.ts +0 -7
  92. package/dist/plain-cli.d.ts.map +0 -1
  93. package/dist/plain-cli.js +0 -44
  94. package/src/hooks/useBashHistorySelector.ts +0 -77
  95. package/src/hooks/useCommandSelector.ts +0 -131
  96. package/src/hooks/useFileSelector.ts +0 -227
  97. package/src/hooks/useImageManager.ts +0 -64
  98. package/src/hooks/useInputHistory.ts +0 -74
  99. package/src/hooks/useInputKeyboardHandler.ts +0 -778
  100. package/src/hooks/useInputState.ts +0 -66
  101. package/src/hooks/useMemoryTypeSelector.ts +0 -40
  102. package/src/plain-cli.ts +0 -60
@@ -0,0 +1,461 @@
1
+ import { useEffect, useRef, useState, useCallback } from "react";
2
+ import { Key } from "ink";
3
+ import {
4
+ InputManager,
5
+ InputManagerCallbacks,
6
+ AttachedImage,
7
+ } from "../managers/InputManager.js";
8
+ import { FileItem } from "../components/FileSelector.js";
9
+
10
+ export const useInputManager = (
11
+ callbacks: Partial<InputManagerCallbacks> = {},
12
+ ) => {
13
+ const managerRef = useRef<InputManager | null>(null);
14
+ const [isManagerReady, setIsManagerReady] = useState(false);
15
+
16
+ // React state that mirrors InputManager state
17
+ const [inputText, setInputText] = useState("");
18
+ const [cursorPosition, setCursorPosition] = useState(0);
19
+ const [fileSelectorState, setFileSelectorState] = useState({
20
+ show: false,
21
+ files: [] as FileItem[],
22
+ query: "",
23
+ position: -1,
24
+ });
25
+ const [commandSelectorState, setCommandSelectorState] = useState({
26
+ show: false,
27
+ query: "",
28
+ position: -1,
29
+ });
30
+ const [bashHistorySelectorState, setBashHistorySelectorState] = useState({
31
+ show: false,
32
+ query: "",
33
+ position: -1,
34
+ });
35
+ const [memoryTypeSelectorState, setMemoryTypeSelectorState] = useState({
36
+ show: false,
37
+ message: "",
38
+ });
39
+ const [showBashManager, setShowBashManager] = useState(false);
40
+ const [showMcpManager, setShowMcpManager] = useState(false);
41
+ const [attachedImages, setAttachedImages] = useState<AttachedImage[]>([]);
42
+
43
+ // Create InputManager on mount and update callbacks when they change
44
+ useEffect(() => {
45
+ if (!managerRef.current) {
46
+ // Create InputManager on first mount
47
+ const manager = new InputManager({
48
+ onInputTextChange: setInputText,
49
+ onCursorPositionChange: setCursorPosition,
50
+ onFileSelectorStateChange: (show, files, query, position) => {
51
+ setFileSelectorState({ show, files, query, position });
52
+ },
53
+ onCommandSelectorStateChange: (show, query, position) => {
54
+ setCommandSelectorState({ show, query, position });
55
+ },
56
+ onBashHistorySelectorStateChange: (show, query, position) => {
57
+ setBashHistorySelectorState({ show, query, position });
58
+ },
59
+ onMemoryTypeSelectorStateChange: (show, message) => {
60
+ setMemoryTypeSelectorState({ show, message });
61
+ },
62
+ onBashManagerStateChange: (show) => {
63
+ setShowBashManager(show);
64
+ },
65
+ onMcpManagerStateChange: (show) => {
66
+ setShowMcpManager(show);
67
+ },
68
+ onImagesStateChange: setAttachedImages,
69
+ onShowBashManager: () => setShowBashManager(true),
70
+ onShowMcpManager: () => setShowMcpManager(true),
71
+ ...callbacks,
72
+ });
73
+
74
+ managerRef.current = manager;
75
+ setIsManagerReady(true);
76
+ } else {
77
+ // Update callbacks on existing manager
78
+ managerRef.current.updateCallbacks({
79
+ onInputTextChange: setInputText,
80
+ onCursorPositionChange: setCursorPosition,
81
+ onFileSelectorStateChange: (show, files, query, position) => {
82
+ setFileSelectorState({ show, files, query, position });
83
+ },
84
+ onCommandSelectorStateChange: (show, query, position) => {
85
+ setCommandSelectorState({ show, query, position });
86
+ },
87
+ onBashHistorySelectorStateChange: (show, query, position) => {
88
+ setBashHistorySelectorState({ show, query, position });
89
+ },
90
+ onMemoryTypeSelectorStateChange: (show, message) => {
91
+ setMemoryTypeSelectorState({ show, message });
92
+ },
93
+ onBashManagerStateChange: (show) => {
94
+ setShowBashManager(show);
95
+ },
96
+ onMcpManagerStateChange: (show) => {
97
+ setShowMcpManager(show);
98
+ },
99
+ onImagesStateChange: setAttachedImages,
100
+ onShowBashManager: () => setShowBashManager(true),
101
+ onShowMcpManager: () => setShowMcpManager(true),
102
+ ...callbacks,
103
+ });
104
+ }
105
+ }, [callbacks]);
106
+
107
+ // Cleanup on unmount
108
+ useEffect(() => {
109
+ return () => {
110
+ if (managerRef.current) {
111
+ managerRef.current.destroy();
112
+ }
113
+ };
114
+ }, []);
115
+
116
+ // Expose manager methods
117
+ const insertTextAtCursor = useCallback(
118
+ (
119
+ text: string,
120
+ callback?: (newText: string, newCursorPosition: number) => void,
121
+ ) => {
122
+ managerRef.current?.insertTextAtCursor(text, callback);
123
+ },
124
+ [],
125
+ );
126
+
127
+ const deleteCharAtCursor = useCallback(
128
+ (callback?: (newText: string, newCursorPosition: number) => void) => {
129
+ managerRef.current?.deleteCharAtCursor(callback);
130
+ },
131
+ [],
132
+ );
133
+
134
+ const clearInput = useCallback(() => {
135
+ managerRef.current?.clearInput();
136
+ }, []);
137
+
138
+ const moveCursorLeft = useCallback(() => {
139
+ managerRef.current?.moveCursorLeft();
140
+ }, []);
141
+
142
+ const moveCursorRight = useCallback(() => {
143
+ managerRef.current?.moveCursorRight();
144
+ }, []);
145
+
146
+ const moveCursorToStart = useCallback(() => {
147
+ managerRef.current?.moveCursorToStart();
148
+ }, []);
149
+
150
+ const moveCursorToEnd = useCallback(() => {
151
+ managerRef.current?.moveCursorToEnd();
152
+ }, []);
153
+
154
+ // File selector methods
155
+ const activateFileSelector = useCallback((position: number) => {
156
+ managerRef.current?.activateFileSelector(position);
157
+ }, []);
158
+
159
+ const handleFileSelect = useCallback(
160
+ (filePath: string) => {
161
+ return (
162
+ managerRef.current?.handleFileSelect(filePath) || {
163
+ newInput: inputText,
164
+ newCursorPosition: cursorPosition,
165
+ }
166
+ );
167
+ },
168
+ [inputText, cursorPosition],
169
+ );
170
+
171
+ const handleCancelFileSelect = useCallback(() => {
172
+ managerRef.current?.handleCancelFileSelect();
173
+ }, []);
174
+
175
+ const updateFileSearchQuery = useCallback((query: string) => {
176
+ managerRef.current?.updateFileSearchQuery(query);
177
+ }, []);
178
+
179
+ const checkForAtDeletion = useCallback((cursorPos: number) => {
180
+ return managerRef.current?.checkForAtDeletion(cursorPos) || false;
181
+ }, []);
182
+
183
+ // Command selector methods
184
+ const activateCommandSelector = useCallback((position: number) => {
185
+ managerRef.current?.activateCommandSelector(position);
186
+ }, []);
187
+
188
+ const handleCommandSelect = useCallback(
189
+ (command: string) => {
190
+ return (
191
+ managerRef.current?.handleCommandSelect(command) || {
192
+ newInput: inputText,
193
+ newCursorPosition: cursorPosition,
194
+ }
195
+ );
196
+ },
197
+ [inputText, cursorPosition],
198
+ );
199
+
200
+ const handleCommandInsert = useCallback(
201
+ (command: string) => {
202
+ return (
203
+ managerRef.current?.handleCommandInsert(command) || {
204
+ newInput: inputText,
205
+ newCursorPosition: cursorPosition,
206
+ }
207
+ );
208
+ },
209
+ [inputText, cursorPosition],
210
+ );
211
+
212
+ const handleCancelCommandSelect = useCallback(() => {
213
+ managerRef.current?.handleCancelCommandSelect();
214
+ }, []);
215
+
216
+ const updateCommandSearchQuery = useCallback((query: string) => {
217
+ managerRef.current?.updateCommandSearchQuery(query);
218
+ }, []);
219
+
220
+ const checkForSlashDeletion = useCallback((cursorPos: number) => {
221
+ return managerRef.current?.checkForSlashDeletion(cursorPos) || false;
222
+ }, []);
223
+
224
+ // Bash history selector methods
225
+ const activateBashHistorySelector = useCallback((position: number) => {
226
+ managerRef.current?.activateBashHistorySelector(position);
227
+ }, []);
228
+
229
+ const handleBashHistorySelect = useCallback(
230
+ (command: string) => {
231
+ return (
232
+ managerRef.current?.handleBashHistorySelect(command) || {
233
+ newInput: inputText,
234
+ newCursorPosition: cursorPosition,
235
+ }
236
+ );
237
+ },
238
+ [inputText, cursorPosition],
239
+ );
240
+
241
+ const handleCancelBashHistorySelect = useCallback(() => {
242
+ managerRef.current?.handleCancelBashHistorySelect();
243
+ }, []);
244
+
245
+ const updateBashHistorySearchQuery = useCallback((query: string) => {
246
+ managerRef.current?.updateBashHistorySearchQuery(query);
247
+ }, []);
248
+
249
+ const handleBashHistoryExecute = useCallback((command: string) => {
250
+ return managerRef.current?.handleBashHistoryExecute(command) || command;
251
+ }, []);
252
+
253
+ const checkForExclamationDeletion = useCallback((cursorPos: number) => {
254
+ return managerRef.current?.checkForExclamationDeletion(cursorPos) || false;
255
+ }, []);
256
+
257
+ // Memory type selector methods
258
+ const activateMemoryTypeSelector = useCallback((message: string) => {
259
+ managerRef.current?.activateMemoryTypeSelector(message);
260
+ }, []);
261
+
262
+ const handleMemoryTypeSelect = useCallback(
263
+ async (type: "project" | "user") => {
264
+ await managerRef.current?.handleMemoryTypeSelect(type);
265
+ },
266
+ [],
267
+ );
268
+
269
+ const handleCancelMemoryTypeSelect = useCallback(() => {
270
+ managerRef.current?.handleCancelMemoryTypeSelect();
271
+ }, []);
272
+
273
+ // Input history methods
274
+ const setUserInputHistory = useCallback((history: string[]) => {
275
+ managerRef.current?.setUserInputHistory(history);
276
+ }, []);
277
+
278
+ const navigateHistory = useCallback(
279
+ (direction: "up" | "down", currentInput: string) => {
280
+ return (
281
+ managerRef.current?.navigateHistory(direction, currentInput) || {
282
+ newInput: currentInput,
283
+ newCursorPosition: currentInput.length,
284
+ }
285
+ );
286
+ },
287
+ [],
288
+ );
289
+
290
+ const resetHistoryNavigation = useCallback(() => {
291
+ managerRef.current?.resetHistoryNavigation();
292
+ }, []);
293
+
294
+ // Special character handling
295
+ const handleSpecialCharInput = useCallback((char: string) => {
296
+ managerRef.current?.handleSpecialCharInput(char);
297
+ }, []);
298
+
299
+ // Direct state access methods (for compatibility with existing code)
300
+ const setInputTextDirect = useCallback((text: string) => {
301
+ managerRef.current?.setInputText(text);
302
+ }, []);
303
+
304
+ const setCursorPositionDirect = useCallback((position: number) => {
305
+ managerRef.current?.setCursorPosition(position);
306
+ }, []);
307
+
308
+ // Complex handlers that combine multiple operations
309
+ const handleBashHistoryExecuteAndSend = useCallback((command: string) => {
310
+ managerRef.current?.handleBashHistoryExecuteAndSend(command);
311
+ }, []);
312
+
313
+ return {
314
+ // State
315
+ inputText,
316
+ cursorPosition,
317
+ showFileSelector: fileSelectorState.show,
318
+ filteredFiles: fileSelectorState.files,
319
+ fileSearchQuery: fileSelectorState.query,
320
+ atPosition: fileSelectorState.position,
321
+ showCommandSelector: commandSelectorState.show,
322
+ commandSearchQuery: commandSelectorState.query,
323
+ slashPosition: commandSelectorState.position,
324
+ showBashHistorySelector: bashHistorySelectorState.show,
325
+ bashHistorySearchQuery: bashHistorySelectorState.query,
326
+ exclamationPosition: bashHistorySelectorState.position,
327
+ showMemoryTypeSelector: memoryTypeSelectorState.show,
328
+ memoryMessage: memoryTypeSelectorState.message,
329
+ showBashManager,
330
+ showMcpManager,
331
+ attachedImages,
332
+ isManagerReady,
333
+
334
+ // Methods
335
+ insertTextAtCursor,
336
+ deleteCharAtCursor,
337
+ clearInput,
338
+ moveCursorLeft,
339
+ moveCursorRight,
340
+ moveCursorToStart,
341
+ moveCursorToEnd,
342
+
343
+ // File selector
344
+ activateFileSelector,
345
+ handleFileSelect,
346
+ handleCancelFileSelect,
347
+ updateFileSearchQuery,
348
+ checkForAtDeletion,
349
+
350
+ // Command selector
351
+ activateCommandSelector,
352
+ handleCommandSelect,
353
+ handleCommandInsert,
354
+ handleCancelCommandSelect,
355
+ updateCommandSearchQuery,
356
+ checkForSlashDeletion,
357
+
358
+ // Bash history selector
359
+ activateBashHistorySelector,
360
+ handleBashHistorySelect,
361
+ handleCancelBashHistorySelect,
362
+ updateBashHistorySearchQuery,
363
+
364
+ handleBashHistoryExecute,
365
+ checkForExclamationDeletion,
366
+
367
+ // Memory type selector
368
+ activateMemoryTypeSelector,
369
+ handleMemoryTypeSelect,
370
+ handleCancelMemoryTypeSelect,
371
+
372
+ // Input history
373
+ setUserInputHistory,
374
+ navigateHistory,
375
+ resetHistoryNavigation,
376
+
377
+ // Special handling
378
+ handleSpecialCharInput,
379
+
380
+ // Bash/MCP Manager
381
+ setShowBashManager: useCallback((show: boolean) => {
382
+ managerRef.current?.setShowBashManager(show);
383
+ }, []),
384
+ setShowMcpManager: useCallback((show: boolean) => {
385
+ managerRef.current?.setShowMcpManager(show);
386
+ }, []),
387
+
388
+ // Image management
389
+ addImage: useCallback((imagePath: string, mimeType: string) => {
390
+ return managerRef.current?.addImage(imagePath, mimeType);
391
+ }, []),
392
+ removeImage: useCallback((imageId: number) => {
393
+ managerRef.current?.removeImage(imageId);
394
+ }, []),
395
+ clearImages: useCallback(() => {
396
+ managerRef.current?.clearImages();
397
+ }, []),
398
+ handlePasteImage: useCallback(async () => {
399
+ return (await managerRef.current?.handlePasteImage()) || false;
400
+ }, []),
401
+
402
+ // Paste and text handling
403
+ handlePasteInput: useCallback((input: string) => {
404
+ managerRef.current?.handlePasteInput(input);
405
+ }, []),
406
+ handleSubmit: useCallback(
407
+ async (
408
+ attachedImages: Array<{ id: number; path: string; mimeType: string }>,
409
+ isLoading: boolean = false,
410
+ isCommandRunning: boolean = false,
411
+ ) => {
412
+ await managerRef.current?.handleSubmit(
413
+ attachedImages,
414
+ isLoading,
415
+ isCommandRunning,
416
+ );
417
+ },
418
+ [],
419
+ ),
420
+ expandLongTextPlaceholders: useCallback((text: string) => {
421
+ return managerRef.current?.expandLongTextPlaceholders(text) || text;
422
+ }, []),
423
+ clearLongTextMap: useCallback(() => {
424
+ managerRef.current?.clearLongTextMap();
425
+ }, []),
426
+
427
+ // Complex handlers combining multiple operations
428
+ handleBashHistoryExecuteAndSend,
429
+
430
+ // Main input handler
431
+ handleInput: useCallback(
432
+ async (
433
+ input: string,
434
+ key: Key,
435
+ attachedImages: Array<{ id: number; path: string; mimeType: string }>,
436
+ isLoading: boolean = false,
437
+ isCommandRunning: boolean = false,
438
+ clearImages?: () => void,
439
+ ) => {
440
+ return (
441
+ (await managerRef.current?.handleInput(
442
+ input,
443
+ key,
444
+ attachedImages,
445
+ isLoading,
446
+ isCommandRunning,
447
+ clearImages,
448
+ )) || false
449
+ );
450
+ },
451
+ [],
452
+ ),
453
+
454
+ // Direct state setters (for React compatibility)
455
+ setInputText: setInputTextDirect,
456
+ setCursorPosition: setCursorPositionDirect,
457
+
458
+ // Manager reference for advanced usage
459
+ manager: managerRef.current,
460
+ };
461
+ };
package/src/index.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import yargs from "yargs";
2
2
  import { hideBin } from "yargs/helpers";
3
3
  import { startCli } from "./cli.js";
4
- import { listSessions } from "wave-agent-sdk";
4
+ import { listSessions, getSessionFilePath } from "wave-agent-sdk";
5
5
 
6
6
  // Export main function for external use
7
7
  export async function main() {
@@ -16,11 +16,15 @@ export async function main() {
16
16
  description: "Continue from last session",
17
17
  type: "boolean",
18
18
  })
19
- .option("plain", {
19
+ .option("print", {
20
20
  alias: "p",
21
- description: "Plain mode with message to send",
21
+ description: "Print response without interactive mode",
22
22
  type: "string",
23
23
  })
24
+ .option("show-stats", {
25
+ description: "Show timing and usage statistics in print mode",
26
+ type: "boolean",
27
+ })
24
28
  .option("list-sessions", {
25
29
  description: "List all available sessions",
26
30
  type: "boolean",
@@ -30,8 +34,11 @@ export async function main() {
30
34
  .example("$0", "Start CLI with default settings")
31
35
  .example("$0 --restore session_123", "Restore specific session")
32
36
  .example("$0 --continue", "Continue from last session")
33
- .example("$0 --plain 'Hello'", "Send message in plain mode")
34
- .example("$0 -p 'Hello'", "Send message in plain mode (short)")
37
+ .example("$0 --print 'Hello'", "Send message in print mode")
38
+ .example(
39
+ "$0 -p 'Hello' --show-stats",
40
+ "Send message in print mode with statistics",
41
+ )
35
42
  .example("$0 --list-sessions", "List all available sessions")
36
43
  .help("h")
37
44
  .parseAsync();
@@ -53,9 +60,11 @@ export async function main() {
53
60
  for (const session of sessions) {
54
61
  const startedAt = new Date(session.startedAt).toLocaleString();
55
62
  const lastActiveAt = new Date(session.lastActiveAt).toLocaleString();
63
+ const filePath = await getSessionFilePath(session.id, session.workdir);
56
64
 
57
65
  console.log(`ID: ${session.id}`);
58
66
  console.log(` Workdir: ${session.workdir}`);
67
+ console.log(` File Path: ${filePath}`);
59
68
  console.log(` Started: ${startedAt}`);
60
69
  console.log(` Last Active: ${lastActiveAt}`);
61
70
  console.log(` Last Message Tokens: ${session.latestTotalTokens}`);
@@ -69,13 +78,14 @@ export async function main() {
69
78
  }
70
79
  }
71
80
 
72
- // Handle plain mode directly
73
- if (argv.plain !== undefined) {
74
- const { startPlainCli } = await import("./plain-cli.js");
75
- return startPlainCli({
81
+ // Handle print mode directly
82
+ if (argv.print !== undefined) {
83
+ const { startPrintCli } = await import("./print-cli.js");
84
+ return startPrintCli({
76
85
  restoreSessionId: argv.restore,
77
86
  continueLastSession: argv.continue,
78
- message: argv.plain,
87
+ message: argv.print,
88
+ showStats: argv.showStats,
79
89
  });
80
90
  }
81
91