wave-code 0.0.6 → 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 +1 -1
- 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 +4 -2
- 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/InputBox.d.ts.map +1 -1
- package/dist/components/InputBox.js +10 -1
- package/dist/components/MemoryDisplay.js +1 -1
- package/dist/components/MessageItem.d.ts +1 -2
- package/dist/components/MessageItem.d.ts.map +1 -1
- package/dist/components/MessageItem.js +3 -3
- package/dist/components/MessageList.d.ts.map +1 -1
- package/dist/components/MessageList.js +2 -2
- 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/ToolResultDisplay.d.ts.map +1 -1
- package/dist/components/ToolResultDisplay.js +2 -1
- package/dist/contexts/useChat.d.ts +13 -1
- package/dist/contexts/useChat.d.ts.map +1 -1
- package/dist/contexts/useChat.js +117 -15
- package/dist/hooks/useInputManager.d.ts +3 -0
- package/dist/hooks/useInputManager.d.ts.map +1 -1
- package/dist/hooks/useInputManager.js +17 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -4
- package/dist/managers/InputManager.d.ts +8 -0
- package/dist/managers/InputManager.d.ts.map +1 -1
- package/dist/managers/InputManager.js +33 -2
- package/dist/print-cli.d.ts +1 -0
- package/dist/print-cli.d.ts.map +1 -1
- package/dist/print-cli.js +36 -3
- 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/package.json +6 -5
- 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 +29 -15
- package/src/components/Confirmation.tsx +253 -0
- package/src/components/DiffDisplay.tsx +300 -0
- package/src/components/FileSelector.tsx +2 -4
- package/src/components/InputBox.tsx +37 -14
- package/src/components/MemoryDisplay.tsx +1 -1
- package/src/components/MessageItem.tsx +4 -12
- package/src/components/MessageList.tsx +0 -2
- package/src/components/ReasoningDisplay.tsx +33 -0
- package/src/components/ToolResultDisplay.tsx +4 -0
- package/src/contexts/useChat.tsx +178 -14
- package/src/hooks/useInputManager.ts +19 -0
- package/src/index.ts +34 -4
- package/src/managers/InputManager.ts +46 -2
- package/src/print-cli.ts +42 -2
- package/src/utils/toolParameterTransforms.ts +104 -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 -323
- package/src/utils/fileSearch.ts +0 -133
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Box, Text } from "ink";
|
|
3
3
|
import { MessageSource } from "wave-agent-sdk";
|
|
4
|
-
import { DiffViewer } from "./DiffViewer.js";
|
|
5
4
|
import { CommandOutputDisplay } from "./CommandOutputDisplay.js";
|
|
6
5
|
import { ToolResultDisplay } from "./ToolResultDisplay.js";
|
|
7
6
|
import { MemoryDisplay } from "./MemoryDisplay.js";
|
|
8
7
|
import { CompressDisplay } from "./CompressDisplay.js";
|
|
9
8
|
import { SubagentBlock } from "./SubagentBlock.js";
|
|
9
|
+
import { ReasoningDisplay } from "./ReasoningDisplay.js";
|
|
10
10
|
import { Markdown } from "./Markdown.js";
|
|
11
|
-
export const MessageItem = ({ message, isExpanded, shouldShowHeader,
|
|
11
|
+
export const MessageItem = ({ message, isExpanded, shouldShowHeader, }) => {
|
|
12
12
|
if (message.blocks.length === 0)
|
|
13
13
|
return null;
|
|
14
|
-
return (_jsxs(Box, { flexDirection: "column", gap: 1, marginTop: 1, children: [shouldShowHeader && (_jsx(Box, { children: _jsx(Text, { color: message.role === "user" ? "cyan" : "green", bold: true, children: message.role === "user" ? "👤 You" : "🤖 Assistant" }) })), _jsx(Box, { flexDirection: "column", gap: 1, children: message.blocks.map((block, blockIndex) => (_jsxs(Box, { children: [block.type === "text" && block.content.trim() && (_jsxs(Box, { children: [block.customCommandContent && (_jsxs(Text, { color: "cyan", bold: true, children: ["\u26A1", " "] })), block.source === MessageSource.HOOK && (_jsxs(Text, { color: "magenta", bold: true, children: ["\uD83D\uDD17", " "] })),
|
|
14
|
+
return (_jsxs(Box, { flexDirection: "column", gap: 1, marginTop: 1, children: [shouldShowHeader && (_jsx(Box, { children: _jsx(Text, { color: message.role === "user" ? "cyan" : "green", bold: true, children: message.role === "user" ? "👤 You" : "🤖 Assistant" }) })), _jsx(Box, { flexDirection: "column", gap: 1, children: message.blocks.map((block, blockIndex) => (_jsxs(Box, { children: [block.type === "text" && block.content.trim() && (_jsxs(Box, { children: [block.customCommandContent && (_jsxs(Text, { color: "cyan", bold: true, children: ["\u26A1", " "] })), block.source === MessageSource.HOOK && (_jsxs(Text, { color: "magenta", bold: true, children: ["\uD83D\uDD17", " "] })), _jsx(Markdown, { children: block.content })] })), block.type === "error" && (_jsx(Box, { children: _jsxs(Text, { color: "red", children: ["\u274C Error: ", block.content] }) })), block.type === "command_output" && (_jsx(CommandOutputDisplay, { block: block, isExpanded: isExpanded })), block.type === "tool" && (_jsx(ToolResultDisplay, { block: block, isExpanded: isExpanded })), block.type === "image" && (_jsxs(Box, { children: [_jsx(Text, { color: "magenta", bold: true, children: "\uD83D\uDCF7 Image" }), block.imageUrls && block.imageUrls.length > 0 && (_jsxs(Text, { color: "gray", dimColor: true, children: [" ", "(", block.imageUrls.length, ")"] }))] })), block.type === "memory" && _jsx(MemoryDisplay, { block: block }), block.type === "compress" && (_jsx(CompressDisplay, { block: block, isExpanded: isExpanded })), block.type === "subagent" && _jsx(SubagentBlock, { block: block }), block.type === "reasoning" && _jsx(ReasoningDisplay, { block: block })] }, blockIndex))) })] }));
|
|
15
15
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageList.d.ts","sourceRoot":"","sources":["../../src/components/MessageList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAG9C,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,eAAO,MAAM,WAAW,uHAQnB,gBAAgB,
|
|
1
|
+
{"version":3,"file":"MessageList.d.ts","sourceRoot":"","sources":["../../src/components/MessageList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAG9C,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,eAAO,MAAM,WAAW,uHAQnB,gBAAgB,6CAwIpB,CAAC"}
|
|
@@ -27,11 +27,11 @@ export const MessageList = React.memo(({ messages, isLoading = false, isCommandR
|
|
|
27
27
|
return (_jsxs(Box, { flexDirection: "column", paddingX: 1, gap: 1, children: [omittedCount > 0 && (_jsx(Box, { children: _jsxs(Text, { color: "gray", dimColor: true, children: ["... ", omittedCount, " earlier message", omittedCount !== 1 ? "s" : "", " ", "omitted (showing latest ", maxExpandedMessages, ")"] }) })), _jsx(Static, { items: staticMessages, children: (message, key) => {
|
|
28
28
|
// Get previous message
|
|
29
29
|
const previousMessage = key > 0 ? staticMessages[key - 1] : undefined;
|
|
30
|
-
return (_jsx(MessageItem, { message: message, shouldShowHeader: previousMessage?.role !== message.role, isExpanded: isExpanded
|
|
30
|
+
return (_jsx(MessageItem, { message: message, shouldShowHeader: previousMessage?.role !== message.role, isExpanded: isExpanded }, key));
|
|
31
31
|
} }), dynamicMessages.map((message, index) => {
|
|
32
32
|
const messageIndex = staticMessages.length + index;
|
|
33
33
|
const previousMessage = messageIndex > 0 ? displayMessages[messageIndex - 1] : undefined;
|
|
34
|
-
return (_jsx(Box, { marginTop: -1, children: _jsx(MessageItem, { message: message, shouldShowHeader: previousMessage?.role !== message.role, isExpanded: isExpanded
|
|
34
|
+
return (_jsx(Box, { marginTop: -1, children: _jsx(MessageItem, { message: message, shouldShowHeader: previousMessage?.role !== message.role, isExpanded: isExpanded }) }, `dynamic-${index}`));
|
|
35
35
|
}), (isLoading || isCommandRunning || isCompressing) && (_jsxs(Box, { flexDirection: "column", gap: 1, children: [isLoading && (_jsxs(Box, { children: [_jsx(Text, { color: "yellow", children: "\uD83D\uDCAD AI is thinking... " }), _jsxs(Text, { color: "gray", dimColor: true, children: ["|", " "] }), _jsx(Text, { color: "red", bold: true, children: "Esc" }), _jsxs(Text, { color: "gray", dimColor: true, children: [" ", "to abort"] })] })), isCommandRunning && (_jsx(Text, { color: "blue", children: "\uD83D\uDE80 Command is running..." })), isCompressing && (_jsx(Text, { color: "magenta", children: "\uD83D\uDDDC\uFE0F Compressing message history..." }))] })), messages.length > 0 && (_jsx(Box, { children: _jsxs(Box, { justifyContent: "space-between", width: "100%", children: [_jsx(Box, { children: _jsxs(Text, { color: "gray", children: ["Messages ", messages.length, latestTotalTokens > 0 && (_jsxs(_Fragment, { children: [_jsxs(Text, { color: "gray", dimColor: true, children: [" ", "|", " "] }), _jsx(Text, { color: "blue", bold: true, children: latestTotalTokens.toLocaleString() }), _jsxs(Text, { color: "gray", dimColor: true, children: [" ", "tokens"] })] }))] }) }), _jsxs(Text, { color: "gray", dimColor: true, children: [_jsx(Text, { color: "cyan", children: "Ctrl+O" }), " Toggle", " ", isExpanded ? "Collapse" : "Expand"] })] }) }))] }));
|
|
36
36
|
});
|
|
37
37
|
// Add display name for debugging
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { ReasoningBlock } from "wave-agent-sdk";
|
|
3
|
+
interface ReasoningDisplayProps {
|
|
4
|
+
block: ReasoningBlock;
|
|
5
|
+
}
|
|
6
|
+
export declare const ReasoningDisplay: React.FC<ReasoningDisplayProps>;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=ReasoningDisplay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReasoningDisplay.d.ts","sourceRoot":"","sources":["../../src/components/ReasoningDisplay.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGrD,UAAU,qBAAqB;IAC7B,KAAK,EAAE,cAAc,CAAC;CACvB;AAED,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAuB5D,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Box } from "ink";
|
|
3
|
+
import { Markdown } from "./Markdown.js";
|
|
4
|
+
export const ReasoningDisplay = ({ block, }) => {
|
|
5
|
+
const { content } = block;
|
|
6
|
+
if (!content || !content.trim()) {
|
|
7
|
+
return null;
|
|
8
|
+
}
|
|
9
|
+
return (_jsx(Box, { borderRight: false, borderTop: false, borderBottom: false, borderStyle: "classic", borderColor: "blue", paddingLeft: 1, children: _jsx(Box, { flexDirection: "column", children: _jsx(Markdown, { children: content }) }) }));
|
|
10
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolResultDisplay.d.ts","sourceRoot":"","sources":["../../src/components/ToolResultDisplay.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"ToolResultDisplay.d.ts","sourceRoot":"","sources":["../../src/components/ToolResultDisplay.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhD,UAAU,sBAAsB;IAC9B,KAAK,EAAE,SAAS,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,sBAAsB,CAmI9D,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Box, Text } from "ink";
|
|
3
|
+
import { DiffDisplay } from "./DiffDisplay.js";
|
|
3
4
|
export const ToolResultDisplay = ({ block, isExpanded = false, }) => {
|
|
4
5
|
const { parameters, result, compactParams, stage, success, error, name } = block;
|
|
5
6
|
// Directly use compactParams
|
|
@@ -48,5 +49,5 @@ export const ToolResultDisplay = ({ block, isExpanded = false, }) => {
|
|
|
48
49
|
return null;
|
|
49
50
|
};
|
|
50
51
|
const shortResult = getShortResult();
|
|
51
|
-
return (_jsxs(Box, { flexDirection: "column", gap: 1, children: [_jsxs(Box, { children: [_jsx(Text, { color: "magenta", children: "\uD83D\uDD27 " }), _jsx(Text, { color: "white", children: toolName }), !isExpanded && compactParams && (_jsxs(Text, { color: "gray", children: [" ", compactParams] })), _jsxs(Text, { color: getStatusColor(), children: [" ", getStatusText()] }), hasImages() && _jsxs(Text, { color: "blue", children: [" ", getImageIndicator()] })] }), !isExpanded && shortResult && !error && (_jsx(Box, { paddingLeft: 2, borderLeft: true, borderColor: "gray", flexDirection: "column", children: shortResult.split("\n").map((line, index) => (_jsx(Text, { color: "white", children: line }, index))) })), isExpanded && parameters && (_jsxs(Box, { paddingLeft: 2, borderLeft: true, borderColor: "gray", flexDirection: "column", children: [_jsx(Text, { color: "cyan", bold: true, children: "Parameters:" }), _jsx(Text, { color: "gray", children: parameters })] })), isExpanded && result && (_jsx(Box, { flexDirection: "column", children: _jsxs(Box, { paddingLeft: 2, borderLeft: true, borderColor: "green", flexDirection: "column", children: [_jsx(Text, { color: "cyan", bold: true, children: "Result:" }), _jsx(Text, { color: "white", children: result })] }) })), error && (_jsx(Box, { children: _jsxs(Text, { color: "red", children: ["Error: ", typeof error === "string" ? error : String(error)] }) }))] }));
|
|
52
|
+
return (_jsxs(Box, { flexDirection: "column", gap: 1, children: [_jsxs(Box, { children: [_jsx(Text, { color: "magenta", children: "\uD83D\uDD27 " }), _jsx(Text, { color: "white", children: toolName }), !isExpanded && compactParams && (_jsxs(Text, { color: "gray", children: [" ", compactParams] })), _jsxs(Text, { color: getStatusColor(), children: [" ", getStatusText()] }), hasImages() && _jsxs(Text, { color: "blue", children: [" ", getImageIndicator()] })] }), !isExpanded && shortResult && !error && (_jsx(Box, { paddingLeft: 2, borderLeft: true, borderColor: "gray", flexDirection: "column", children: shortResult.split("\n").map((line, index) => (_jsx(Text, { color: "white", children: line }, index))) })), isExpanded && parameters && (_jsxs(Box, { paddingLeft: 2, borderLeft: true, borderColor: "gray", flexDirection: "column", children: [_jsx(Text, { color: "cyan", bold: true, children: "Parameters:" }), _jsx(Text, { color: "gray", children: parameters })] })), isExpanded && result && (_jsx(Box, { flexDirection: "column", children: _jsxs(Box, { paddingLeft: 2, borderLeft: true, borderColor: "green", flexDirection: "column", children: [_jsx(Text, { color: "cyan", bold: true, children: "Result:" }), _jsx(Text, { color: "white", children: result })] }) })), error && (_jsx(Box, { children: _jsxs(Text, { color: "red", children: ["Error: ", typeof error === "string" ? error : String(error)] }) })), _jsx(DiffDisplay, { toolBlock: block })] }));
|
|
52
53
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import type { Message, McpServerStatus, BackgroundShell, SlashCommand } from "wave-agent-sdk";
|
|
2
|
+
import type { Message, McpServerStatus, BackgroundShell, SlashCommand, PermissionDecision, PermissionMode } from "wave-agent-sdk";
|
|
3
3
|
export interface ChatContextType {
|
|
4
4
|
messages: Message[];
|
|
5
5
|
isLoading: boolean;
|
|
@@ -28,10 +28,22 @@ export interface ChatContextType {
|
|
|
28
28
|
slashCommands: SlashCommand[];
|
|
29
29
|
hasSlashCommand: (commandId: string) => boolean;
|
|
30
30
|
subagentMessages: Record<string, Message[]>;
|
|
31
|
+
permissionMode: PermissionMode;
|
|
32
|
+
setPermissionMode: (mode: PermissionMode) => void;
|
|
33
|
+
isConfirmationVisible: boolean;
|
|
34
|
+
confirmingTool?: {
|
|
35
|
+
name: string;
|
|
36
|
+
input?: Record<string, unknown>;
|
|
37
|
+
};
|
|
38
|
+
showConfirmation: (toolName: string, toolInput?: Record<string, unknown>) => Promise<PermissionDecision>;
|
|
39
|
+
hideConfirmation: () => void;
|
|
40
|
+
handleConfirmationDecision: (decision: PermissionDecision) => void;
|
|
41
|
+
handleConfirmationCancel: () => void;
|
|
31
42
|
}
|
|
32
43
|
export declare const useChat: () => ChatContextType;
|
|
33
44
|
export interface ChatProviderProps {
|
|
34
45
|
children: React.ReactNode;
|
|
46
|
+
bypassPermissions?: boolean;
|
|
35
47
|
}
|
|
36
48
|
export declare const ChatProvider: React.FC<ChatProviderProps>;
|
|
37
49
|
//# sourceMappingURL=useChat.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useChat.d.ts","sourceRoot":"","sources":["../../src/contexts/useChat.tsx"],"names":[],"mappings":"AAAA,OAAO,KAON,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EACV,OAAO,EACP,eAAe,EACf,eAAe,EACf,YAAY,
|
|
1
|
+
{"version":3,"file":"useChat.d.ts","sourceRoot":"","sources":["../../src/contexts/useChat.tsx"],"names":[],"mappings":"AAAA,OAAO,KAON,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EACV,OAAO,EACP,eAAe,EACf,eAAe,EACf,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACf,MAAM,gBAAgB,CAAC;AAUxB,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,aAAa,EAAE,OAAO,CAAC;IACvB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAE3B,UAAU,EAAE,OAAO,CAAC;IAEpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,CACX,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,KAC/C,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAE1B,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzE,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,gBAAgB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3D,mBAAmB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAE9D,gBAAgB,EAAE,eAAe,EAAE,CAAC;IACpC,wBAAwB,EAAE,CACxB,OAAO,EAAE,MAAM,KACZ;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC/D,mBAAmB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IAElD,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,eAAe,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;IAEhD,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IAE5C,cAAc,EAAE,cAAc,CAAC;IAC/B,iBAAiB,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IAElD,qBAAqB,EAAE,OAAO,CAAC;IAC/B,cAAc,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;IACnE,gBAAgB,EAAE,CAChB,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAChC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACjC,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,0BAA0B,EAAE,CAAC,QAAQ,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACnE,wBAAwB,EAAE,MAAM,IAAI,CAAC;CACtC;AAID,eAAO,MAAM,OAAO,uBAMnB,CAAC;AAEF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAqZpD,CAAC"}
|
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);
|
|
@@ -33,19 +33,27 @@ export const ChatProvider = ({ children }) => {
|
|
|
33
33
|
const [slashCommands, setSlashCommands] = useState([]);
|
|
34
34
|
// Subagent messages state
|
|
35
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
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
|
+
}, []);
|
|
49
57
|
// Initialize AI manager
|
|
50
58
|
useEffect(() => {
|
|
51
59
|
const initializeAgent = async () => {
|
|
@@ -74,18 +82,40 @@ export const ChatProvider = ({ children }) => {
|
|
|
74
82
|
setBackgroundShells([...shells]);
|
|
75
83
|
},
|
|
76
84
|
onSubagentMessagesChange: (subagentId, messages) => {
|
|
85
|
+
logger.debug("onSubagentMessagesChange", subagentId, messages.length);
|
|
77
86
|
setSubagentMessages((prev) => ({
|
|
78
87
|
...prev,
|
|
79
88
|
[subagentId]: [...messages],
|
|
80
89
|
}));
|
|
81
90
|
},
|
|
91
|
+
onPermissionModeChange: (mode) => {
|
|
92
|
+
setPermissionModeState(mode);
|
|
93
|
+
},
|
|
82
94
|
};
|
|
83
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
|
+
};
|
|
84
111
|
const agent = await Agent.create({
|
|
85
112
|
callbacks,
|
|
86
113
|
restoreSessionId,
|
|
87
114
|
continueLastSession,
|
|
88
115
|
logger,
|
|
116
|
+
permissionMode: bypassPermissions ? "bypassPermissions" : undefined,
|
|
117
|
+
canUseTool: permissionCallback,
|
|
118
|
+
stream: false, // 关闭流式模式
|
|
89
119
|
});
|
|
90
120
|
agentRef.current = agent;
|
|
91
121
|
// Get initial state
|
|
@@ -96,6 +126,7 @@ export const ChatProvider = ({ children }) => {
|
|
|
96
126
|
setIsCommandRunning(agent.isCommandRunning);
|
|
97
127
|
setIsCompressing(agent.isCompressing);
|
|
98
128
|
setUserInputHistory(agent.userInputHistory);
|
|
129
|
+
setPermissionModeState(agent.getPermissionMode());
|
|
99
130
|
// Get initial MCP servers state
|
|
100
131
|
const mcpServers = agent.getMcpServers?.() || [];
|
|
101
132
|
setMcpServers(mcpServers);
|
|
@@ -108,7 +139,12 @@ export const ChatProvider = ({ children }) => {
|
|
|
108
139
|
}
|
|
109
140
|
};
|
|
110
141
|
initializeAgent();
|
|
111
|
-
}, [
|
|
142
|
+
}, [
|
|
143
|
+
restoreSessionId,
|
|
144
|
+
continueLastSession,
|
|
145
|
+
bypassPermissions,
|
|
146
|
+
showConfirmation,
|
|
147
|
+
]);
|
|
112
148
|
// Cleanup on unmount
|
|
113
149
|
useEffect(() => {
|
|
114
150
|
return () => {
|
|
@@ -186,6 +222,17 @@ export const ChatProvider = ({ children }) => {
|
|
|
186
222
|
const saveMemory = useCallback(async (message, type) => {
|
|
187
223
|
await agentRef.current?.saveMemory(message, type);
|
|
188
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
|
+
}, []);
|
|
189
236
|
// MCP management methods - delegate to Agent
|
|
190
237
|
const connectMcpServer = useCallback(async (serverName) => {
|
|
191
238
|
return (await agentRef.current?.connectMcpServer(serverName)) ?? false;
|
|
@@ -209,6 +256,53 @@ export const ChatProvider = ({ children }) => {
|
|
|
209
256
|
return false;
|
|
210
257
|
return agentRef.current.hasSlashCommand(commandId);
|
|
211
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
|
+
});
|
|
212
306
|
const contextValue = {
|
|
213
307
|
messages,
|
|
214
308
|
isLoading,
|
|
@@ -230,6 +324,14 @@ export const ChatProvider = ({ children }) => {
|
|
|
230
324
|
slashCommands,
|
|
231
325
|
hasSlashCommand,
|
|
232
326
|
subagentMessages,
|
|
327
|
+
permissionMode,
|
|
328
|
+
setPermissionMode,
|
|
329
|
+
isConfirmationVisible,
|
|
330
|
+
confirmingTool,
|
|
331
|
+
showConfirmation,
|
|
332
|
+
hideConfirmation,
|
|
333
|
+
handleConfirmationDecision,
|
|
334
|
+
handleConfirmationCancel,
|
|
233
335
|
};
|
|
234
336
|
return (_jsx(ChatContext.Provider, { value: contextValue, children: children }));
|
|
235
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,6 +19,7 @@ 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[];
|
|
22
24
|
isManagerReady: boolean;
|
|
23
25
|
insertTextAtCursor: (text: string, callback?: (newText: string, newCursorPosition: number) => void) => void;
|
|
@@ -68,6 +70,7 @@ export declare const useInputManager: (callbacks?: Partial<InputManagerCallbacks
|
|
|
68
70
|
handleSpecialCharInput: (char: string) => void;
|
|
69
71
|
setShowBashManager: (show: boolean) => void;
|
|
70
72
|
setShowMcpManager: (show: boolean) => void;
|
|
73
|
+
setPermissionMode: (mode: PermissionMode) => void;
|
|
71
74
|
addImage: (imagePath: string, mimeType: string) => AttachedImage | undefined;
|
|
72
75
|
removeImage: (imageId: number) => void;
|
|
73
76
|
clearImages: () => void;
|
|
@@ -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,5 +1,6 @@
|
|
|
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);
|
|
5
6
|
const [isManagerReady, setIsManagerReady] = useState(false);
|
|
@@ -28,12 +29,14 @@ export const useInputManager = (callbacks = {}) => {
|
|
|
28
29
|
});
|
|
29
30
|
const [showBashManager, setShowBashManager] = useState(false);
|
|
30
31
|
const [showMcpManager, setShowMcpManager] = useState(false);
|
|
32
|
+
const [permissionMode, setPermissionModeState] = useState("default");
|
|
31
33
|
const [attachedImages, setAttachedImages] = useState([]);
|
|
32
34
|
// Create InputManager on mount and update callbacks when they change
|
|
33
35
|
useEffect(() => {
|
|
34
36
|
if (!managerRef.current) {
|
|
35
37
|
// Create InputManager on first mount
|
|
36
38
|
const manager = new InputManager({
|
|
39
|
+
logger,
|
|
37
40
|
onInputTextChange: setInputText,
|
|
38
41
|
onCursorPositionChange: setCursorPosition,
|
|
39
42
|
onFileSelectorStateChange: (show, files, query, position) => {
|
|
@@ -54,6 +57,10 @@ export const useInputManager = (callbacks = {}) => {
|
|
|
54
57
|
onMcpManagerStateChange: (show) => {
|
|
55
58
|
setShowMcpManager(show);
|
|
56
59
|
},
|
|
60
|
+
onPermissionModeChange: (mode) => {
|
|
61
|
+
setPermissionModeState(mode);
|
|
62
|
+
callbacks.onPermissionModeChange?.(mode);
|
|
63
|
+
},
|
|
57
64
|
onImagesStateChange: setAttachedImages,
|
|
58
65
|
onShowBashManager: () => setShowBashManager(true),
|
|
59
66
|
onShowMcpManager: () => setShowMcpManager(true),
|
|
@@ -65,6 +72,7 @@ export const useInputManager = (callbacks = {}) => {
|
|
|
65
72
|
else {
|
|
66
73
|
// Update callbacks on existing manager
|
|
67
74
|
managerRef.current.updateCallbacks({
|
|
75
|
+
logger,
|
|
68
76
|
onInputTextChange: setInputText,
|
|
69
77
|
onCursorPositionChange: setCursorPosition,
|
|
70
78
|
onFileSelectorStateChange: (show, files, query, position) => {
|
|
@@ -85,6 +93,10 @@ export const useInputManager = (callbacks = {}) => {
|
|
|
85
93
|
onMcpManagerStateChange: (show) => {
|
|
86
94
|
setShowMcpManager(show);
|
|
87
95
|
},
|
|
96
|
+
onPermissionModeChange: (mode) => {
|
|
97
|
+
setPermissionModeState(mode);
|
|
98
|
+
callbacks.onPermissionModeChange?.(mode);
|
|
99
|
+
},
|
|
88
100
|
onImagesStateChange: setAttachedImages,
|
|
89
101
|
onShowBashManager: () => setShowBashManager(true),
|
|
90
102
|
onShowMcpManager: () => setShowMcpManager(true),
|
|
@@ -244,6 +256,7 @@ export const useInputManager = (callbacks = {}) => {
|
|
|
244
256
|
memoryMessage: memoryTypeSelectorState.message,
|
|
245
257
|
showBashManager,
|
|
246
258
|
showMcpManager,
|
|
259
|
+
permissionMode,
|
|
247
260
|
attachedImages,
|
|
248
261
|
isManagerReady,
|
|
249
262
|
// Methods
|
|
@@ -291,6 +304,10 @@ export const useInputManager = (callbacks = {}) => {
|
|
|
291
304
|
setShowMcpManager: useCallback((show) => {
|
|
292
305
|
managerRef.current?.setShowMcpManager(show);
|
|
293
306
|
}, []),
|
|
307
|
+
setPermissionMode: useCallback((mode) => {
|
|
308
|
+
setPermissionModeState(mode);
|
|
309
|
+
managerRef.current?.setPermissionMode(mode);
|
|
310
|
+
}, []),
|
|
294
311
|
// Image management
|
|
295
312
|
addImage: useCallback((imagePath, mimeType) => {
|
|
296
313
|
return managerRef.current?.addImage(imagePath, mimeType);
|
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, getSessionFilePath } 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))
|
|
@@ -27,6 +27,11 @@ export async function main() {
|
|
|
27
27
|
.option("list-sessions", {
|
|
28
28
|
description: "List all available sessions",
|
|
29
29
|
type: "boolean",
|
|
30
|
+
})
|
|
31
|
+
.option("dangerously-skip-permissions", {
|
|
32
|
+
description: "Skip all permission checks (dangerous)",
|
|
33
|
+
type: "boolean",
|
|
34
|
+
default: false,
|
|
30
35
|
})
|
|
31
36
|
.version()
|
|
32
37
|
.alias("v", "version")
|
|
@@ -49,18 +54,29 @@ export async function main() {
|
|
|
49
54
|
}
|
|
50
55
|
console.log(`Available sessions for: ${currentWorkdir}`);
|
|
51
56
|
console.log("==========================================");
|
|
52
|
-
|
|
53
|
-
|
|
57
|
+
// Get last 5 sessions
|
|
58
|
+
const lastSessions = sessions.slice(0, 5);
|
|
59
|
+
for (const session of lastSessions) {
|
|
54
60
|
const lastActiveAt = new Date(session.lastActiveAt).toLocaleString();
|
|
55
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
|
+
}
|
|
56
69
|
console.log(`ID: ${session.id}`);
|
|
57
70
|
console.log(` Workdir: ${session.workdir}`);
|
|
58
71
|
console.log(` File Path: ${filePath}`);
|
|
59
|
-
console.log(` Started: ${startedAt}`);
|
|
60
72
|
console.log(` Last Active: ${lastActiveAt}`);
|
|
61
73
|
console.log(` Last Message Tokens: ${session.latestTotalTokens}`);
|
|
74
|
+
console.log(` First Message: ${truncatedContent}`);
|
|
62
75
|
console.log("");
|
|
63
76
|
}
|
|
77
|
+
if (sessions.length > 5) {
|
|
78
|
+
console.log(`... and ${sessions.length - 5} more sessions`);
|
|
79
|
+
}
|
|
64
80
|
return;
|
|
65
81
|
}
|
|
66
82
|
catch (error) {
|
|
@@ -76,11 +92,13 @@ export async function main() {
|
|
|
76
92
|
continueLastSession: argv.continue,
|
|
77
93
|
message: argv.print,
|
|
78
94
|
showStats: argv.showStats,
|
|
95
|
+
bypassPermissions: argv.dangerouslySkipPermissions,
|
|
79
96
|
});
|
|
80
97
|
}
|
|
81
98
|
await startCli({
|
|
82
99
|
restoreSessionId: argv.restore,
|
|
83
100
|
continueLastSession: argv.continue,
|
|
101
|
+
bypassPermissions: argv.dangerouslySkipPermissions,
|
|
84
102
|
});
|
|
85
103
|
}
|
|
86
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;
|
|
@@ -150,6 +155,9 @@ export declare class InputManager {
|
|
|
150
155
|
setShowBashManager(show: boolean): void;
|
|
151
156
|
getShowMcpManager(): boolean;
|
|
152
157
|
setShowMcpManager(show: boolean): void;
|
|
158
|
+
getPermissionMode(): PermissionMode;
|
|
159
|
+
setPermissionMode(mode: PermissionMode): void;
|
|
160
|
+
cyclePermissionMode(): void;
|
|
153
161
|
handleSubmit(attachedImages: Array<{
|
|
154
162
|
id: number;
|
|
155
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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"}
|