wave-code 0.0.5 → 0.0.8
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/README.md +3 -3
- package/dist/cli.d.ts +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +2 -2
- package/dist/components/App.d.ts +1 -0
- package/dist/components/App.d.ts.map +1 -1
- package/dist/components/App.js +4 -4
- package/dist/components/BashHistorySelector.d.ts.map +1 -1
- package/dist/components/BashHistorySelector.js +17 -3
- package/dist/components/ChatInterface.d.ts.map +1 -1
- package/dist/components/ChatInterface.js +6 -24
- package/dist/components/CommandSelector.js +4 -4
- package/dist/components/Confirmation.d.ts +11 -0
- package/dist/components/Confirmation.d.ts.map +1 -0
- package/dist/components/Confirmation.js +148 -0
- package/dist/components/DiffDisplay.d.ts +8 -0
- package/dist/components/DiffDisplay.d.ts.map +1 -0
- package/dist/components/DiffDisplay.js +168 -0
- package/dist/components/FileSelector.d.ts +2 -4
- package/dist/components/FileSelector.d.ts.map +1 -1
- package/dist/components/FileSelector.js +2 -2
- package/dist/components/InputBox.d.ts.map +1 -1
- package/dist/components/InputBox.js +30 -50
- package/dist/components/Markdown.d.ts +6 -0
- package/dist/components/Markdown.d.ts.map +1 -0
- package/dist/components/Markdown.js +22 -0
- package/dist/components/MemoryDisplay.js +1 -1
- package/dist/components/MessageItem.d.ts +8 -0
- package/dist/components/MessageItem.d.ts.map +1 -0
- package/dist/components/MessageItem.js +15 -0
- package/dist/components/MessageList.d.ts +1 -1
- package/dist/components/MessageList.d.ts.map +1 -1
- package/dist/components/MessageList.js +33 -33
- package/dist/components/ReasoningDisplay.d.ts +8 -0
- package/dist/components/ReasoningDisplay.d.ts.map +1 -0
- package/dist/components/ReasoningDisplay.js +10 -0
- package/dist/components/SubagentBlock.d.ts +0 -1
- package/dist/components/SubagentBlock.d.ts.map +1 -1
- package/dist/components/SubagentBlock.js +29 -30
- package/dist/components/ToolResultDisplay.d.ts.map +1 -1
- package/dist/components/ToolResultDisplay.js +6 -5
- package/dist/contexts/useChat.d.ts +14 -2
- package/dist/contexts/useChat.d.ts.map +1 -1
- package/dist/contexts/useChat.js +128 -17
- package/dist/hooks/useInputManager.d.ts +6 -1
- package/dist/hooks/useInputManager.d.ts.map +1 -1
- package/dist/hooks/useInputManager.js +32 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +30 -5
- package/dist/managers/InputManager.d.ts +11 -1
- package/dist/managers/InputManager.d.ts.map +1 -1
- package/dist/managers/InputManager.js +77 -26
- package/dist/print-cli.d.ts +2 -0
- package/dist/print-cli.d.ts.map +1 -1
- package/dist/print-cli.js +121 -23
- package/dist/utils/toolParameterTransforms.d.ts +23 -0
- package/dist/utils/toolParameterTransforms.d.ts.map +1 -0
- package/dist/utils/toolParameterTransforms.js +77 -0
- package/dist/utils/usageSummary.d.ts +6 -0
- package/dist/utils/usageSummary.d.ts.map +1 -1
- package/dist/utils/usageSummary.js +72 -0
- package/package.json +13 -8
- package/src/cli.tsx +3 -1
- package/src/components/App.tsx +7 -3
- package/src/components/BashHistorySelector.tsx +26 -3
- package/src/components/ChatInterface.tsx +38 -54
- package/src/components/CommandSelector.tsx +5 -5
- package/src/components/Confirmation.tsx +253 -0
- package/src/components/DiffDisplay.tsx +300 -0
- package/src/components/FileSelector.tsx +4 -6
- package/src/components/InputBox.tsx +58 -87
- package/src/components/Markdown.tsx +29 -0
- package/src/components/MemoryDisplay.tsx +1 -1
- package/src/components/MessageItem.tsx +96 -0
- package/src/components/MessageList.tsx +140 -202
- package/src/components/ReasoningDisplay.tsx +33 -0
- package/src/components/SubagentBlock.tsx +56 -84
- package/src/components/ToolResultDisplay.tsx +9 -5
- package/src/contexts/useChat.tsx +194 -21
- package/src/hooks/useInputManager.ts +40 -3
- package/src/index.ts +45 -5
- package/src/managers/InputManager.ts +101 -27
- package/src/print-cli.ts +143 -21
- package/src/utils/toolParameterTransforms.ts +104 -0
- package/src/utils/usageSummary.ts +109 -0
- package/dist/components/DiffViewer.d.ts +0 -9
- package/dist/components/DiffViewer.d.ts.map +0 -1
- package/dist/components/DiffViewer.js +0 -221
- package/dist/utils/fileSearch.d.ts +0 -20
- package/dist/utils/fileSearch.d.ts.map +0 -1
- package/dist/utils/fileSearch.js +0 -102
- package/src/components/DiffViewer.tsx +0 -321
- package/src/utils/fileSearch.ts +0 -133
package/dist/contexts/useChat.js
CHANGED
|
@@ -2,7 +2,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
2
2
|
import { createContext, useContext, useCallback, useRef, useEffect, useState, } from "react";
|
|
3
3
|
import { useInput } from "ink";
|
|
4
4
|
import { useAppConfig } from "./useAppConfig.js";
|
|
5
|
-
import { Agent } from "wave-agent-sdk";
|
|
5
|
+
import { Agent, } from "wave-agent-sdk";
|
|
6
6
|
import { logger } from "../utils/logger.js";
|
|
7
7
|
import { displayUsageSummary } from "../utils/usageSummary.js";
|
|
8
8
|
const ChatContext = createContext(null);
|
|
@@ -13,7 +13,7 @@ export const useChat = () => {
|
|
|
13
13
|
}
|
|
14
14
|
return context;
|
|
15
15
|
};
|
|
16
|
-
export const ChatProvider = ({ children }) => {
|
|
16
|
+
export const ChatProvider = ({ children, bypassPermissions, }) => {
|
|
17
17
|
const { restoreSessionId, continueLastSession } = useAppConfig();
|
|
18
18
|
// Message Display State
|
|
19
19
|
const [isExpanded, setIsExpanded] = useState(false);
|
|
@@ -31,15 +31,29 @@ export const ChatProvider = ({ children }) => {
|
|
|
31
31
|
const [backgroundShells, setBackgroundShells] = useState([]);
|
|
32
32
|
// Command state
|
|
33
33
|
const [slashCommands, setSlashCommands] = useState([]);
|
|
34
|
-
//
|
|
35
|
-
const [
|
|
34
|
+
// Subagent messages state
|
|
35
|
+
const [subagentMessages, setSubagentMessages] = useState({});
|
|
36
|
+
// Permission state
|
|
37
|
+
const [permissionMode, setPermissionModeState] = useState("default");
|
|
38
|
+
// Confirmation state with queue-based architecture
|
|
39
|
+
const [isConfirmationVisible, setIsConfirmationVisible] = useState(false);
|
|
40
|
+
const [confirmingTool, setConfirmingTool] = useState();
|
|
41
|
+
const [confirmationQueue, setConfirmationQueue] = useState([]);
|
|
42
|
+
const [currentConfirmation, setCurrentConfirmation] = useState(null);
|
|
36
43
|
const agentRef = useRef(null);
|
|
37
|
-
//
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
44
|
+
// Permission confirmation methods with queue support
|
|
45
|
+
const showConfirmation = useCallback(async (toolName, toolInput) => {
|
|
46
|
+
return new Promise((resolve, reject) => {
|
|
47
|
+
const queueItem = {
|
|
48
|
+
toolName,
|
|
49
|
+
toolInput,
|
|
50
|
+
resolver: resolve,
|
|
51
|
+
reject,
|
|
52
|
+
};
|
|
53
|
+
setConfirmationQueue((prev) => [...prev, queueItem]);
|
|
54
|
+
// processNextConfirmation will be called via useEffect
|
|
55
|
+
});
|
|
56
|
+
}, []);
|
|
43
57
|
// Initialize AI manager
|
|
44
58
|
useEffect(() => {
|
|
45
59
|
const initializeAgent = async () => {
|
|
@@ -51,7 +65,9 @@ export const ChatProvider = ({ children }) => {
|
|
|
51
65
|
setMcpServers([...servers]);
|
|
52
66
|
},
|
|
53
67
|
onSessionIdChange: (sessionId) => {
|
|
54
|
-
|
|
68
|
+
process.stdout.write("\x1Bc", () => {
|
|
69
|
+
setSessionId(sessionId);
|
|
70
|
+
});
|
|
55
71
|
},
|
|
56
72
|
onLatestTotalTokensChange: (tokens) => {
|
|
57
73
|
setlatestTotalTokens(tokens);
|
|
@@ -65,16 +81,41 @@ export const ChatProvider = ({ children }) => {
|
|
|
65
81
|
onShellsChange: (shells) => {
|
|
66
82
|
setBackgroundShells([...shells]);
|
|
67
83
|
},
|
|
68
|
-
|
|
69
|
-
|
|
84
|
+
onSubagentMessagesChange: (subagentId, messages) => {
|
|
85
|
+
logger.debug("onSubagentMessagesChange", subagentId, messages.length);
|
|
86
|
+
setSubagentMessages((prev) => ({
|
|
87
|
+
...prev,
|
|
88
|
+
[subagentId]: [...messages],
|
|
89
|
+
}));
|
|
90
|
+
},
|
|
91
|
+
onPermissionModeChange: (mode) => {
|
|
92
|
+
setPermissionModeState(mode);
|
|
70
93
|
},
|
|
71
94
|
};
|
|
72
95
|
try {
|
|
96
|
+
// Create the permission callback inside the try block to access showConfirmation
|
|
97
|
+
const permissionCallback = bypassPermissions
|
|
98
|
+
? undefined
|
|
99
|
+
: async (context) => {
|
|
100
|
+
try {
|
|
101
|
+
return await showConfirmation(context.toolName, context.toolInput);
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
// If confirmation was cancelled or failed, deny the operation
|
|
105
|
+
return {
|
|
106
|
+
behavior: "deny",
|
|
107
|
+
message: "Operation cancelled by user",
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
};
|
|
73
111
|
const agent = await Agent.create({
|
|
74
112
|
callbacks,
|
|
75
113
|
restoreSessionId,
|
|
76
114
|
continueLastSession,
|
|
77
115
|
logger,
|
|
116
|
+
permissionMode: bypassPermissions ? "bypassPermissions" : undefined,
|
|
117
|
+
canUseTool: permissionCallback,
|
|
118
|
+
stream: false, // 关闭流式模式
|
|
78
119
|
});
|
|
79
120
|
agentRef.current = agent;
|
|
80
121
|
// Get initial state
|
|
@@ -85,21 +126,25 @@ export const ChatProvider = ({ children }) => {
|
|
|
85
126
|
setIsCommandRunning(agent.isCommandRunning);
|
|
86
127
|
setIsCompressing(agent.isCompressing);
|
|
87
128
|
setUserInputHistory(agent.userInputHistory);
|
|
129
|
+
setPermissionModeState(agent.getPermissionMode());
|
|
88
130
|
// Get initial MCP servers state
|
|
89
131
|
const mcpServers = agent.getMcpServers?.() || [];
|
|
90
132
|
setMcpServers(mcpServers);
|
|
91
133
|
// Get initial commands
|
|
92
134
|
const agentSlashCommands = agent.getSlashCommands?.() || [];
|
|
93
135
|
setSlashCommands(agentSlashCommands);
|
|
94
|
-
// Get initial usages
|
|
95
|
-
setUsages(agent.usages);
|
|
96
136
|
}
|
|
97
137
|
catch (error) {
|
|
98
138
|
console.error("Failed to initialize AI manager:", error);
|
|
99
139
|
}
|
|
100
140
|
};
|
|
101
141
|
initializeAgent();
|
|
102
|
-
}, [
|
|
142
|
+
}, [
|
|
143
|
+
restoreSessionId,
|
|
144
|
+
continueLastSession,
|
|
145
|
+
bypassPermissions,
|
|
146
|
+
showConfirmation,
|
|
147
|
+
]);
|
|
103
148
|
// Cleanup on unmount
|
|
104
149
|
useEffect(() => {
|
|
105
150
|
return () => {
|
|
@@ -177,6 +222,17 @@ export const ChatProvider = ({ children }) => {
|
|
|
177
222
|
const saveMemory = useCallback(async (message, type) => {
|
|
178
223
|
await agentRef.current?.saveMemory(message, type);
|
|
179
224
|
}, []);
|
|
225
|
+
// Permission management methods
|
|
226
|
+
const setPermissionMode = useCallback((mode) => {
|
|
227
|
+
setPermissionModeState((prev) => {
|
|
228
|
+
if (prev === mode)
|
|
229
|
+
return prev;
|
|
230
|
+
if (agentRef.current && agentRef.current.getPermissionMode() !== mode) {
|
|
231
|
+
agentRef.current.setPermissionMode(mode);
|
|
232
|
+
}
|
|
233
|
+
return mode;
|
|
234
|
+
});
|
|
235
|
+
}, []);
|
|
180
236
|
// MCP management methods - delegate to Agent
|
|
181
237
|
const connectMcpServer = useCallback(async (serverName) => {
|
|
182
238
|
return (await agentRef.current?.connectMcpServer(serverName)) ?? false;
|
|
@@ -200,6 +256,53 @@ export const ChatProvider = ({ children }) => {
|
|
|
200
256
|
return false;
|
|
201
257
|
return agentRef.current.hasSlashCommand(commandId);
|
|
202
258
|
}, []);
|
|
259
|
+
// Queue processing helper
|
|
260
|
+
const processNextConfirmation = useCallback(() => {
|
|
261
|
+
if (confirmationQueue.length > 0 && !isConfirmationVisible) {
|
|
262
|
+
const next = confirmationQueue[0];
|
|
263
|
+
setCurrentConfirmation(next);
|
|
264
|
+
setConfirmingTool({ name: next.toolName, input: next.toolInput });
|
|
265
|
+
setIsConfirmationVisible(true);
|
|
266
|
+
setConfirmationQueue((prev) => prev.slice(1));
|
|
267
|
+
}
|
|
268
|
+
}, [confirmationQueue, isConfirmationVisible]);
|
|
269
|
+
// Process queue when queue changes or confirmation is hidden
|
|
270
|
+
useEffect(() => {
|
|
271
|
+
processNextConfirmation();
|
|
272
|
+
}, [processNextConfirmation]);
|
|
273
|
+
const hideConfirmation = useCallback(() => {
|
|
274
|
+
setIsConfirmationVisible(false);
|
|
275
|
+
setConfirmingTool(undefined);
|
|
276
|
+
setCurrentConfirmation(null);
|
|
277
|
+
}, []);
|
|
278
|
+
const handleConfirmationDecision = useCallback((decision) => {
|
|
279
|
+
if (currentConfirmation) {
|
|
280
|
+
currentConfirmation.resolver(decision);
|
|
281
|
+
}
|
|
282
|
+
hideConfirmation();
|
|
283
|
+
}, [currentConfirmation, hideConfirmation]);
|
|
284
|
+
const handleConfirmationCancel = useCallback(() => {
|
|
285
|
+
if (currentConfirmation) {
|
|
286
|
+
currentConfirmation.reject();
|
|
287
|
+
}
|
|
288
|
+
hideConfirmation();
|
|
289
|
+
}, [currentConfirmation, hideConfirmation]);
|
|
290
|
+
// Listen for Ctrl+O hotkey to toggle collapse/expand state and ESC to cancel confirmation
|
|
291
|
+
useInput((input, key) => {
|
|
292
|
+
if (key.ctrl && input === "o") {
|
|
293
|
+
// Clear terminal screen when expanded state changes
|
|
294
|
+
process.stdout.write("\x1Bc", () => {
|
|
295
|
+
setIsExpanded((prev) => {
|
|
296
|
+
const newExpanded = !prev;
|
|
297
|
+
return newExpanded;
|
|
298
|
+
});
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
// Handle ESC key to cancel confirmation
|
|
302
|
+
if (key.escape && isConfirmationVisible) {
|
|
303
|
+
handleConfirmationCancel();
|
|
304
|
+
}
|
|
305
|
+
});
|
|
203
306
|
const contextValue = {
|
|
204
307
|
messages,
|
|
205
308
|
isLoading,
|
|
@@ -220,7 +323,15 @@ export const ChatProvider = ({ children }) => {
|
|
|
220
323
|
killBackgroundShell,
|
|
221
324
|
slashCommands,
|
|
222
325
|
hasSlashCommand,
|
|
223
|
-
|
|
326
|
+
subagentMessages,
|
|
327
|
+
permissionMode,
|
|
328
|
+
setPermissionMode,
|
|
329
|
+
isConfirmationVisible,
|
|
330
|
+
confirmingTool,
|
|
331
|
+
showConfirmation,
|
|
332
|
+
hideConfirmation,
|
|
333
|
+
handleConfirmationDecision,
|
|
334
|
+
handleConfirmationCancel,
|
|
224
335
|
};
|
|
225
336
|
return (_jsx(ChatContext.Provider, { value: contextValue, children: children }));
|
|
226
337
|
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Key } from "ink";
|
|
2
2
|
import { InputManager, InputManagerCallbacks, AttachedImage } from "../managers/InputManager.js";
|
|
3
3
|
import { FileItem } from "../components/FileSelector.js";
|
|
4
|
+
import { PermissionMode } from "wave-agent-sdk";
|
|
4
5
|
export declare const useInputManager: (callbacks?: Partial<InputManagerCallbacks>) => {
|
|
5
6
|
inputText: string;
|
|
6
7
|
cursorPosition: number;
|
|
@@ -18,7 +19,9 @@ export declare const useInputManager: (callbacks?: Partial<InputManagerCallbacks
|
|
|
18
19
|
memoryMessage: string;
|
|
19
20
|
showBashManager: boolean;
|
|
20
21
|
showMcpManager: boolean;
|
|
22
|
+
permissionMode: PermissionMode;
|
|
21
23
|
attachedImages: AttachedImage[];
|
|
24
|
+
isManagerReady: boolean;
|
|
22
25
|
insertTextAtCursor: (text: string, callback?: (newText: string, newCursorPosition: number) => void) => void;
|
|
23
26
|
deleteCharAtCursor: (callback?: (newText: string, newCursorPosition: number) => void) => void;
|
|
24
27
|
clearInput: () => void;
|
|
@@ -56,7 +59,7 @@ export declare const useInputManager: (callbacks?: Partial<InputManagerCallbacks
|
|
|
56
59
|
handleBashHistoryExecute: (command: string) => string;
|
|
57
60
|
checkForExclamationDeletion: (cursorPos: number) => boolean;
|
|
58
61
|
activateMemoryTypeSelector: (message: string) => void;
|
|
59
|
-
handleMemoryTypeSelect: (type: "project" | "user") => void
|
|
62
|
+
handleMemoryTypeSelect: (type: "project" | "user") => Promise<void>;
|
|
60
63
|
handleCancelMemoryTypeSelect: () => void;
|
|
61
64
|
setUserInputHistory: (history: string[]) => void;
|
|
62
65
|
navigateHistory: (direction: "up" | "down", currentInput: string) => {
|
|
@@ -67,6 +70,7 @@ export declare const useInputManager: (callbacks?: Partial<InputManagerCallbacks
|
|
|
67
70
|
handleSpecialCharInput: (char: string) => void;
|
|
68
71
|
setShowBashManager: (show: boolean) => void;
|
|
69
72
|
setShowMcpManager: (show: boolean) => void;
|
|
73
|
+
setPermissionMode: (mode: PermissionMode) => void;
|
|
70
74
|
addImage: (imagePath: string, mimeType: string) => AttachedImage | undefined;
|
|
71
75
|
removeImage: (imageId: number) => void;
|
|
72
76
|
clearImages: () => void;
|
|
@@ -79,6 +83,7 @@ export declare const useInputManager: (callbacks?: Partial<InputManagerCallbacks
|
|
|
79
83
|
}>, isLoading?: boolean, isCommandRunning?: boolean) => Promise<void>;
|
|
80
84
|
expandLongTextPlaceholders: (text: string) => string;
|
|
81
85
|
clearLongTextMap: () => void;
|
|
86
|
+
handleBashHistoryExecuteAndSend: (command: string) => void;
|
|
82
87
|
handleInput: (input: string, key: Key, attachedImages: Array<{
|
|
83
88
|
id: number;
|
|
84
89
|
path: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useInputManager.d.ts","sourceRoot":"","sources":["../../src/hooks/useInputManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,OAAO,EACL,YAAY,EACZ,qBAAqB,EACrB,aAAa,EACd,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"useInputManager.d.ts","sourceRoot":"","sources":["../../src/hooks/useInputManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,OAAO,EACL,YAAY,EACZ,qBAAqB,EACrB,aAAa,EACd,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGhD,eAAO,MAAM,eAAe,GAC1B,YAAW,OAAO,CAAC,qBAAqB,CAAM;;;;;;;;;;;;;;;;;;;;+BAwHpC,MAAM,aACD,CAAC,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,KAAK,IAAI;oCAQrD,CAAC,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,KAAK,IAAI;;;;;;qCA2Bd,MAAM;iCAK7C,MAAM;;;;;mCAe+B,MAAM;oCAIL,MAAM;wCAKF,MAAM;mCAKjD,MAAM;;;;mCAYN,MAAM;;;;;sCAemC,MAAM;uCAIL,MAAM;4CAKD,MAAM;uCAKrD,MAAM;;;;;0CAeuC,MAAM;wCAIR,MAAM;6CAID,MAAM;0CAKT,MAAM;mCAKhD,SAAS,GAAG,MAAM;;mCAWiB,MAAM,EAAE;iCAK5C,IAAI,GAAG,MAAM,gBAAgB,MAAM;;;;;mCAgBC,MAAM;+BAuFf,OAAO;8BAGR,OAAO;8BAGP,cAAc;0BAMlB,MAAM,YAAY,MAAM;2BAGvB,MAAM;;;8BAWH,MAAM;mCAKxB,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,cAC1D,OAAO,qBACA,OAAO;uCAUkB,MAAM;;+CApHO,MAAM;yBAiIvD,MAAM,OACR,GAAG,kBACQ,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,cAC1D,OAAO,qBACA,OAAO,gBACX,MAAM,IAAI;yBA/IgB,MAAM;kCAIG,MAAM;;CAkK9D,CAAC"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { useEffect, useRef, useState, useCallback } from "react";
|
|
2
2
|
import { InputManager, } from "../managers/InputManager.js";
|
|
3
|
+
import { logger } from "../utils/logger.js";
|
|
3
4
|
export const useInputManager = (callbacks = {}) => {
|
|
4
5
|
const managerRef = useRef(null);
|
|
6
|
+
const [isManagerReady, setIsManagerReady] = useState(false);
|
|
5
7
|
// React state that mirrors InputManager state
|
|
6
8
|
const [inputText, setInputText] = useState("");
|
|
7
9
|
const [cursorPosition, setCursorPosition] = useState(0);
|
|
@@ -27,12 +29,14 @@ export const useInputManager = (callbacks = {}) => {
|
|
|
27
29
|
});
|
|
28
30
|
const [showBashManager, setShowBashManager] = useState(false);
|
|
29
31
|
const [showMcpManager, setShowMcpManager] = useState(false);
|
|
32
|
+
const [permissionMode, setPermissionModeState] = useState("default");
|
|
30
33
|
const [attachedImages, setAttachedImages] = useState([]);
|
|
31
34
|
// Create InputManager on mount and update callbacks when they change
|
|
32
35
|
useEffect(() => {
|
|
33
36
|
if (!managerRef.current) {
|
|
34
37
|
// Create InputManager on first mount
|
|
35
38
|
const manager = new InputManager({
|
|
39
|
+
logger,
|
|
36
40
|
onInputTextChange: setInputText,
|
|
37
41
|
onCursorPositionChange: setCursorPosition,
|
|
38
42
|
onFileSelectorStateChange: (show, files, query, position) => {
|
|
@@ -53,14 +57,22 @@ export const useInputManager = (callbacks = {}) => {
|
|
|
53
57
|
onMcpManagerStateChange: (show) => {
|
|
54
58
|
setShowMcpManager(show);
|
|
55
59
|
},
|
|
60
|
+
onPermissionModeChange: (mode) => {
|
|
61
|
+
setPermissionModeState(mode);
|
|
62
|
+
callbacks.onPermissionModeChange?.(mode);
|
|
63
|
+
},
|
|
56
64
|
onImagesStateChange: setAttachedImages,
|
|
65
|
+
onShowBashManager: () => setShowBashManager(true),
|
|
66
|
+
onShowMcpManager: () => setShowMcpManager(true),
|
|
57
67
|
...callbacks,
|
|
58
68
|
});
|
|
59
69
|
managerRef.current = manager;
|
|
70
|
+
setIsManagerReady(true);
|
|
60
71
|
}
|
|
61
72
|
else {
|
|
62
73
|
// Update callbacks on existing manager
|
|
63
74
|
managerRef.current.updateCallbacks({
|
|
75
|
+
logger,
|
|
64
76
|
onInputTextChange: setInputText,
|
|
65
77
|
onCursorPositionChange: setCursorPosition,
|
|
66
78
|
onFileSelectorStateChange: (show, files, query, position) => {
|
|
@@ -81,7 +93,13 @@ export const useInputManager = (callbacks = {}) => {
|
|
|
81
93
|
onMcpManagerStateChange: (show) => {
|
|
82
94
|
setShowMcpManager(show);
|
|
83
95
|
},
|
|
96
|
+
onPermissionModeChange: (mode) => {
|
|
97
|
+
setPermissionModeState(mode);
|
|
98
|
+
callbacks.onPermissionModeChange?.(mode);
|
|
99
|
+
},
|
|
84
100
|
onImagesStateChange: setAttachedImages,
|
|
101
|
+
onShowBashManager: () => setShowBashManager(true),
|
|
102
|
+
onShowMcpManager: () => setShowMcpManager(true),
|
|
85
103
|
...callbacks,
|
|
86
104
|
});
|
|
87
105
|
}
|
|
@@ -186,8 +204,8 @@ export const useInputManager = (callbacks = {}) => {
|
|
|
186
204
|
const activateMemoryTypeSelector = useCallback((message) => {
|
|
187
205
|
managerRef.current?.activateMemoryTypeSelector(message);
|
|
188
206
|
}, []);
|
|
189
|
-
const handleMemoryTypeSelect = useCallback((type) => {
|
|
190
|
-
managerRef.current?.handleMemoryTypeSelect(type);
|
|
207
|
+
const handleMemoryTypeSelect = useCallback(async (type) => {
|
|
208
|
+
await managerRef.current?.handleMemoryTypeSelect(type);
|
|
191
209
|
}, []);
|
|
192
210
|
const handleCancelMemoryTypeSelect = useCallback(() => {
|
|
193
211
|
managerRef.current?.handleCancelMemoryTypeSelect();
|
|
@@ -216,6 +234,10 @@ export const useInputManager = (callbacks = {}) => {
|
|
|
216
234
|
const setCursorPositionDirect = useCallback((position) => {
|
|
217
235
|
managerRef.current?.setCursorPosition(position);
|
|
218
236
|
}, []);
|
|
237
|
+
// Complex handlers that combine multiple operations
|
|
238
|
+
const handleBashHistoryExecuteAndSend = useCallback((command) => {
|
|
239
|
+
managerRef.current?.handleBashHistoryExecuteAndSend(command);
|
|
240
|
+
}, []);
|
|
219
241
|
return {
|
|
220
242
|
// State
|
|
221
243
|
inputText,
|
|
@@ -234,7 +256,9 @@ export const useInputManager = (callbacks = {}) => {
|
|
|
234
256
|
memoryMessage: memoryTypeSelectorState.message,
|
|
235
257
|
showBashManager,
|
|
236
258
|
showMcpManager,
|
|
259
|
+
permissionMode,
|
|
237
260
|
attachedImages,
|
|
261
|
+
isManagerReady,
|
|
238
262
|
// Methods
|
|
239
263
|
insertTextAtCursor,
|
|
240
264
|
deleteCharAtCursor,
|
|
@@ -280,6 +304,10 @@ export const useInputManager = (callbacks = {}) => {
|
|
|
280
304
|
setShowMcpManager: useCallback((show) => {
|
|
281
305
|
managerRef.current?.setShowMcpManager(show);
|
|
282
306
|
}, []),
|
|
307
|
+
setPermissionMode: useCallback((mode) => {
|
|
308
|
+
setPermissionModeState(mode);
|
|
309
|
+
managerRef.current?.setPermissionMode(mode);
|
|
310
|
+
}, []),
|
|
283
311
|
// Image management
|
|
284
312
|
addImage: useCallback((imagePath, mimeType) => {
|
|
285
313
|
return managerRef.current?.addImage(imagePath, mimeType);
|
|
@@ -306,6 +334,8 @@ export const useInputManager = (callbacks = {}) => {
|
|
|
306
334
|
clearLongTextMap: useCallback(() => {
|
|
307
335
|
managerRef.current?.clearLongTextMap();
|
|
308
336
|
}, []),
|
|
337
|
+
// Complex handlers combining multiple operations
|
|
338
|
+
handleBashHistoryExecuteAndSend,
|
|
309
339
|
// Main input handler
|
|
310
340
|
handleInput: useCallback(async (input, key, attachedImages, isLoading = false, isCommandRunning = false, clearImages) => {
|
|
311
341
|
return ((await managerRef.current?.handleInput(input, key, attachedImages, isLoading, isCommandRunning, clearImages)) || false);
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAUA,wBAAsB,IAAI,kBAmHzB;AAGD,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAGpC,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAG3C,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,KAAK,oBAAoB,GAC1B,MAAM,sBAAsB,CAAC"}
|
package/dist/index.js
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, getFirstMessageContent, } from "wave-agent-sdk";
|
|
5
5
|
// Export main function for external use
|
|
6
6
|
export async function main() {
|
|
7
7
|
const argv = await yargs(hideBin(process.argv))
|
|
@@ -19,10 +19,19 @@ export async function main() {
|
|
|
19
19
|
alias: "p",
|
|
20
20
|
description: "Print response without interactive mode",
|
|
21
21
|
type: "string",
|
|
22
|
+
})
|
|
23
|
+
.option("show-stats", {
|
|
24
|
+
description: "Show timing and usage statistics in print mode",
|
|
25
|
+
type: "boolean",
|
|
22
26
|
})
|
|
23
27
|
.option("list-sessions", {
|
|
24
28
|
description: "List all available sessions",
|
|
25
29
|
type: "boolean",
|
|
30
|
+
})
|
|
31
|
+
.option("dangerously-skip-permissions", {
|
|
32
|
+
description: "Skip all permission checks (dangerous)",
|
|
33
|
+
type: "boolean",
|
|
34
|
+
default: false,
|
|
26
35
|
})
|
|
27
36
|
.version()
|
|
28
37
|
.alias("v", "version")
|
|
@@ -30,7 +39,7 @@ export async function main() {
|
|
|
30
39
|
.example("$0 --restore session_123", "Restore specific session")
|
|
31
40
|
.example("$0 --continue", "Continue from last session")
|
|
32
41
|
.example("$0 --print 'Hello'", "Send message in print mode")
|
|
33
|
-
.example("$0 -p 'Hello'", "Send message in print mode
|
|
42
|
+
.example("$0 -p 'Hello' --show-stats", "Send message in print mode with statistics")
|
|
34
43
|
.example("$0 --list-sessions", "List all available sessions")
|
|
35
44
|
.help("h")
|
|
36
45
|
.parseAsync();
|
|
@@ -45,16 +54,29 @@ export async function main() {
|
|
|
45
54
|
}
|
|
46
55
|
console.log(`Available sessions for: ${currentWorkdir}`);
|
|
47
56
|
console.log("==========================================");
|
|
48
|
-
|
|
49
|
-
|
|
57
|
+
// Get last 5 sessions
|
|
58
|
+
const lastSessions = sessions.slice(0, 5);
|
|
59
|
+
for (const session of lastSessions) {
|
|
50
60
|
const lastActiveAt = new Date(session.lastActiveAt).toLocaleString();
|
|
61
|
+
const filePath = await getSessionFilePath(session.id, session.workdir);
|
|
62
|
+
// Get first message content
|
|
63
|
+
const firstMessageContent = await getFirstMessageContent(session.id, session.workdir);
|
|
64
|
+
// Truncate content if too long
|
|
65
|
+
let truncatedContent = firstMessageContent || "No first message content";
|
|
66
|
+
if (truncatedContent.length > 30) {
|
|
67
|
+
truncatedContent = truncatedContent.substring(0, 30) + "...";
|
|
68
|
+
}
|
|
51
69
|
console.log(`ID: ${session.id}`);
|
|
52
70
|
console.log(` Workdir: ${session.workdir}`);
|
|
53
|
-
console.log(`
|
|
71
|
+
console.log(` File Path: ${filePath}`);
|
|
54
72
|
console.log(` Last Active: ${lastActiveAt}`);
|
|
55
73
|
console.log(` Last Message Tokens: ${session.latestTotalTokens}`);
|
|
74
|
+
console.log(` First Message: ${truncatedContent}`);
|
|
56
75
|
console.log("");
|
|
57
76
|
}
|
|
77
|
+
if (sessions.length > 5) {
|
|
78
|
+
console.log(`... and ${sessions.length - 5} more sessions`);
|
|
79
|
+
}
|
|
58
80
|
return;
|
|
59
81
|
}
|
|
60
82
|
catch (error) {
|
|
@@ -69,11 +91,14 @@ export async function main() {
|
|
|
69
91
|
restoreSessionId: argv.restore,
|
|
70
92
|
continueLastSession: argv.continue,
|
|
71
93
|
message: argv.print,
|
|
94
|
+
showStats: argv.showStats,
|
|
95
|
+
bypassPermissions: argv.dangerouslySkipPermissions,
|
|
72
96
|
});
|
|
73
97
|
}
|
|
74
98
|
await startCli({
|
|
75
99
|
restoreSessionId: argv.restore,
|
|
76
100
|
continueLastSession: argv.continue,
|
|
101
|
+
bypassPermissions: argv.dangerouslySkipPermissions,
|
|
77
102
|
});
|
|
78
103
|
}
|
|
79
104
|
// Export CLI function
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { FileItem } from "../components/FileSelector.js";
|
|
2
|
+
import { PermissionMode, Logger } from "wave-agent-sdk";
|
|
2
3
|
import type { Key } from "ink";
|
|
3
4
|
export interface AttachedImage {
|
|
4
5
|
id: number;
|
|
@@ -25,6 +26,8 @@ export interface InputManagerCallbacks {
|
|
|
25
26
|
onSaveMemory?: (message: string, type: "project" | "user") => Promise<void>;
|
|
26
27
|
onAbortMessage?: () => void;
|
|
27
28
|
onResetHistoryNavigation?: () => void;
|
|
29
|
+
onPermissionModeChange?: (mode: PermissionMode) => void;
|
|
30
|
+
logger?: Logger;
|
|
28
31
|
}
|
|
29
32
|
export declare class InputManager {
|
|
30
33
|
private inputText;
|
|
@@ -55,8 +58,10 @@ export declare class InputManager {
|
|
|
55
58
|
private imageIdCounter;
|
|
56
59
|
private showBashManager;
|
|
57
60
|
private showMcpManager;
|
|
61
|
+
private permissionMode;
|
|
58
62
|
private selectorJustUsed;
|
|
59
63
|
private callbacks;
|
|
64
|
+
private logger?;
|
|
60
65
|
constructor(callbacks?: InputManagerCallbacks);
|
|
61
66
|
updateCallbacks(callbacks: Partial<InputManagerCallbacks>): void;
|
|
62
67
|
getInputText(): string;
|
|
@@ -100,9 +105,10 @@ export declare class InputManager {
|
|
|
100
105
|
};
|
|
101
106
|
handleCancelBashHistorySelect(): void;
|
|
102
107
|
handleBashHistoryExecute(command: string): string;
|
|
108
|
+
handleBashHistoryExecuteAndSend(command: string): void;
|
|
103
109
|
checkForExclamationDeletion(cursorPosition: number): boolean;
|
|
104
110
|
activateMemoryTypeSelector(message: string): void;
|
|
105
|
-
handleMemoryTypeSelect(type: "project" | "user"): void
|
|
111
|
+
handleMemoryTypeSelect(type: "project" | "user"): Promise<void>;
|
|
106
112
|
handleCancelMemoryTypeSelect(): void;
|
|
107
113
|
setUserInputHistory(history: string[]): void;
|
|
108
114
|
navigateHistory(direction: "up" | "down", currentInput: string): {
|
|
@@ -134,6 +140,7 @@ export declare class InputManager {
|
|
|
134
140
|
show: boolean;
|
|
135
141
|
message: string;
|
|
136
142
|
};
|
|
143
|
+
private updateSearchQueriesForActiveSelectors;
|
|
137
144
|
handleSpecialCharInput(char: string): void;
|
|
138
145
|
generateCompressedText(originalText: string): string;
|
|
139
146
|
expandLongTextPlaceholders(text: string): string;
|
|
@@ -148,6 +155,9 @@ export declare class InputManager {
|
|
|
148
155
|
setShowBashManager(show: boolean): void;
|
|
149
156
|
getShowMcpManager(): boolean;
|
|
150
157
|
setShowMcpManager(show: boolean): void;
|
|
158
|
+
getPermissionMode(): PermissionMode;
|
|
159
|
+
setPermissionMode(mode: PermissionMode): void;
|
|
160
|
+
cyclePermissionMode(): void;
|
|
151
161
|
handleSubmit(attachedImages: Array<{
|
|
152
162
|
id: number;
|
|
153
163
|
path: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InputManager.d.ts","sourceRoot":"","sources":["../../src/managers/InputManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"InputManager.d.ts","sourceRoot":"","sources":["../../src/managers/InputManager.ts"],"names":[],"mappings":"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"}
|