wave-code 0.6.5 → 0.7.1

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 (101) hide show
  1. package/dist/cli.d.ts +1 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +2 -2
  4. package/dist/commands/plugin/disable.d.ts.map +1 -1
  5. package/dist/commands/plugin/disable.js +3 -10
  6. package/dist/commands/plugin/enable.d.ts.map +1 -1
  7. package/dist/commands/plugin/enable.js +3 -10
  8. package/dist/commands/plugin/install.d.ts.map +1 -1
  9. package/dist/commands/plugin/install.js +4 -11
  10. package/dist/commands/plugin/list.d.ts.map +1 -1
  11. package/dist/commands/plugin/list.js +5 -39
  12. package/dist/commands/plugin/marketplace.js +9 -9
  13. package/dist/commands/plugin/uninstall.d.ts.map +1 -1
  14. package/dist/commands/plugin/uninstall.js +4 -17
  15. package/dist/commands/plugin/update.js +3 -3
  16. package/dist/components/App.d.ts +1 -0
  17. package/dist/components/App.d.ts.map +1 -1
  18. package/dist/components/App.js +4 -4
  19. package/dist/components/BackgroundTaskManager.d.ts.map +1 -1
  20. package/dist/components/BackgroundTaskManager.js +34 -18
  21. package/dist/components/ChatInterface.d.ts.map +1 -1
  22. package/dist/components/ChatInterface.js +28 -15
  23. package/dist/components/ConfirmationDetails.d.ts +1 -0
  24. package/dist/components/ConfirmationDetails.d.ts.map +1 -1
  25. package/dist/components/ConfirmationDetails.js +7 -14
  26. package/dist/components/ConfirmationSelector.d.ts +1 -0
  27. package/dist/components/ConfirmationSelector.d.ts.map +1 -1
  28. package/dist/components/ConfirmationSelector.js +164 -117
  29. package/dist/components/DiffDisplay.d.ts +1 -0
  30. package/dist/components/DiffDisplay.d.ts.map +1 -1
  31. package/dist/components/DiffDisplay.js +94 -36
  32. package/dist/components/HistorySearch.d.ts.map +1 -1
  33. package/dist/components/HistorySearch.js +26 -20
  34. package/dist/components/Markdown.d.ts.map +1 -1
  35. package/dist/components/Markdown.js +3 -1
  36. package/dist/components/McpManager.d.ts.map +1 -1
  37. package/dist/components/McpManager.js +49 -52
  38. package/dist/components/MessageBlockItem.d.ts +9 -0
  39. package/dist/components/MessageBlockItem.d.ts.map +1 -0
  40. package/dist/components/MessageBlockItem.js +11 -0
  41. package/dist/components/MessageList.d.ts +2 -4
  42. package/dist/components/MessageList.d.ts.map +1 -1
  43. package/dist/components/MessageList.js +28 -23
  44. package/dist/components/PluginDetail.d.ts.map +1 -1
  45. package/dist/components/PluginDetail.js +19 -22
  46. package/dist/components/SessionSelector.d.ts.map +1 -1
  47. package/dist/components/SessionSelector.js +8 -5
  48. package/dist/components/TaskList.d.ts.map +1 -1
  49. package/dist/components/TaskList.js +2 -5
  50. package/dist/components/ToolDisplay.d.ts.map +1 -1
  51. package/dist/components/ToolDisplay.js +1 -1
  52. package/dist/contexts/useChat.d.ts +1 -0
  53. package/dist/contexts/useChat.d.ts.map +1 -1
  54. package/dist/contexts/useChat.js +20 -3
  55. package/dist/hooks/usePluginManager.d.ts.map +1 -1
  56. package/dist/hooks/usePluginManager.js +20 -39
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +16 -0
  59. package/dist/print-cli.d.ts +1 -0
  60. package/dist/print-cli.d.ts.map +1 -1
  61. package/dist/print-cli.js +2 -1
  62. package/dist/utils/highlightUtils.d.ts +2 -0
  63. package/dist/utils/highlightUtils.d.ts.map +1 -0
  64. package/dist/utils/highlightUtils.js +69 -0
  65. package/dist/utils/toolParameterTransforms.d.ts +2 -6
  66. package/dist/utils/toolParameterTransforms.d.ts.map +1 -1
  67. package/dist/utils/toolParameterTransforms.js +10 -14
  68. package/package.json +4 -2
  69. package/src/cli.tsx +3 -0
  70. package/src/commands/plugin/disable.ts +3 -17
  71. package/src/commands/plugin/enable.ts +3 -17
  72. package/src/commands/plugin/install.ts +4 -18
  73. package/src/commands/plugin/list.ts +5 -55
  74. package/src/commands/plugin/marketplace.ts +9 -9
  75. package/src/commands/plugin/uninstall.ts +4 -26
  76. package/src/commands/plugin/update.ts +3 -3
  77. package/src/components/App.tsx +10 -2
  78. package/src/components/BackgroundTaskManager.tsx +69 -44
  79. package/src/components/ChatInterface.tsx +35 -23
  80. package/src/components/ConfirmationDetails.tsx +13 -15
  81. package/src/components/ConfirmationSelector.tsx +207 -128
  82. package/src/components/DiffDisplay.tsx +164 -75
  83. package/src/components/HistorySearch.tsx +31 -25
  84. package/src/components/Markdown.tsx +3 -1
  85. package/src/components/McpManager.tsx +51 -59
  86. package/src/components/MessageBlockItem.tsx +83 -0
  87. package/src/components/MessageList.tsx +55 -52
  88. package/src/components/PluginDetail.tsx +30 -31
  89. package/src/components/SessionSelector.tsx +8 -5
  90. package/src/components/TaskList.tsx +2 -5
  91. package/src/components/ToolDisplay.tsx +5 -1
  92. package/src/contexts/useChat.tsx +22 -2
  93. package/src/hooks/usePluginManager.ts +21 -57
  94. package/src/index.ts +17 -0
  95. package/src/print-cli.ts +3 -0
  96. package/src/utils/highlightUtils.ts +76 -0
  97. package/src/utils/toolParameterTransforms.ts +11 -20
  98. package/dist/components/MessageItem.d.ts +0 -8
  99. package/dist/components/MessageItem.d.ts.map +0 -1
  100. package/dist/components/MessageItem.js +0 -13
  101. package/src/components/MessageItem.tsx +0 -81
@@ -1,34 +1,33 @@
1
1
  import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
- import React, { useState, useEffect } from "react";
2
+ import { useState, useEffect } from "react";
3
3
  import { Box, Text, useInput } from "ink";
4
4
  import { PromptHistoryManager } from "wave-agent-sdk";
5
5
  export const HistorySearch = ({ searchQuery, onSelect, onCancel, }) => {
6
6
  const MAX_VISIBLE_ITEMS = 5;
7
- const [selectedIndex, setSelectedIndex] = useState(0);
8
- const [entries, setEntries] = useState([]);
9
- const entriesRef = React.useRef([]);
10
- const selectedIndexRef = React.useRef(0);
11
- useEffect(() => {
12
- entriesRef.current = entries;
13
- }, [entries]);
14
- useEffect(() => {
15
- selectedIndexRef.current = selectedIndex;
16
- }, [selectedIndex]);
7
+ const [state, setState] = useState({
8
+ selectedIndex: 0,
9
+ entries: [],
10
+ });
17
11
  useEffect(() => {
18
12
  const fetchHistory = async () => {
19
13
  const results = await PromptHistoryManager.searchHistory(searchQuery);
20
14
  const limitedResults = results.slice(0, 20);
21
- setEntries(limitedResults); // Limit to 20 results
22
- setSelectedIndex(0);
15
+ setState({
16
+ entries: limitedResults,
17
+ selectedIndex: 0,
18
+ });
23
19
  };
24
20
  fetchHistory();
25
21
  }, [searchQuery]);
26
22
  useInput((input, key) => {
27
23
  if (key.return) {
28
- if (entriesRef.current.length > 0 &&
29
- selectedIndexRef.current < entriesRef.current.length) {
30
- onSelect(entriesRef.current[selectedIndexRef.current].prompt);
31
- }
24
+ setState((prev) => {
25
+ if (prev.entries.length > 0 &&
26
+ prev.selectedIndex < prev.entries.length) {
27
+ onSelect(prev.entries[prev.selectedIndex].prompt);
28
+ }
29
+ return prev;
30
+ });
32
31
  return;
33
32
  }
34
33
  if (key.escape) {
@@ -36,14 +35,21 @@ export const HistorySearch = ({ searchQuery, onSelect, onCancel, }) => {
36
35
  return;
37
36
  }
38
37
  if (key.upArrow) {
39
- setSelectedIndex((prev) => Math.max(0, prev - 1));
38
+ setState((prev) => ({
39
+ ...prev,
40
+ selectedIndex: Math.max(0, prev.selectedIndex - 1),
41
+ }));
40
42
  return;
41
43
  }
42
44
  if (key.downArrow) {
43
- setSelectedIndex((prev) => Math.min(entriesRef.current.length - 1, prev + 1));
45
+ setState((prev) => ({
46
+ ...prev,
47
+ selectedIndex: Math.min(prev.entries.length - 1, prev.selectedIndex + 1),
48
+ }));
44
49
  return;
45
50
  }
46
51
  });
52
+ const { entries, selectedIndex } = state;
47
53
  if (entries.length === 0) {
48
54
  return (_jsxs(Box, { flexDirection: "column", borderStyle: "single", borderColor: "yellow", borderBottom: false, borderLeft: false, borderRight: false, children: [_jsxs(Text, { color: "yellow", children: ["No history found ", searchQuery && `for "${searchQuery}"`] }), _jsx(Text, { dimColor: true, children: "Press Escape to cancel" })] }));
49
55
  }
@@ -70,6 +76,6 @@ export const HistorySearch = ({ searchQuery, onSelect, onCancel, }) => {
70
76
  return (_jsxs(Box, { flexDirection: "column", borderStyle: "single", borderColor: "blue", borderBottom: false, borderLeft: false, borderRight: false, gap: 1, children: [_jsx(Box, { children: _jsxs(Text, { color: "blue", bold: true, children: ["Prompt History ", searchQuery && `(filtering: "${searchQuery}")`] }) }), _jsx(Box, { flexDirection: "column", children: visibleEntries.map((entry, index) => {
71
77
  const actualIndex = startIndex + index;
72
78
  const isSelected = actualIndex === selectedIndex;
73
- return (_jsxs(Box, { flexDirection: "row", justifyContent: "space-between", children: [_jsx(Box, { flexShrink: 1, children: _jsx(Text, { color: isSelected ? "black" : "white", backgroundColor: isSelected ? "blue" : undefined, wrap: "truncate-end", children: entry.prompt.replace(/\n/g, " ") }) }), isSelected && (_jsx(Box, { marginLeft: 2, flexShrink: 0, children: _jsx(Text, { color: "gray", dimColor: true, children: formatTimestamp(entry.timestamp) }) }))] }, actualIndex));
79
+ return (_jsxs(Box, { flexDirection: "row", justifyContent: "space-between", children: [_jsx(Box, { flexShrink: 1, children: _jsxs(Text, { color: isSelected ? "black" : "white", backgroundColor: isSelected ? "blue" : undefined, wrap: "truncate-end", children: [isSelected ? "> " : " ", entry.prompt.replace(/\n/g, " ")] }) }), isSelected && (_jsx(Box, { marginLeft: 2, flexShrink: 0, children: _jsx(Text, { color: "gray", dimColor: true, children: formatTimestamp(entry.timestamp) }) }))] }, actualIndex));
74
80
  }) }), _jsx(Box, { children: _jsx(Text, { dimColor: true, children: "Use \u2191\u2193 to navigate, Enter to select, Escape to cancel" }) })] }));
75
81
  };
@@ -1 +1 @@
1
- {"version":3,"file":"Markdown.d.ts","sourceRoot":"","sources":["../../src/components/Markdown.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkB,MAAM,OAAO,CAAC;AAKvC,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAwID,eAAO,MAAM,QAAQ,2CAA6B,aAAa,6CAc7D,CAAC"}
1
+ {"version":3,"file":"Markdown.d.ts","sourceRoot":"","sources":["../../src/components/Markdown.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkB,MAAM,OAAO,CAAC;AAMvC,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAyID,eAAO,MAAM,QAAQ,2CAA6B,aAAa,6CAc7D,CAAC"}
@@ -3,6 +3,7 @@ import React, { useMemo } from "react";
3
3
  import { Box, Text } from "ink";
4
4
  import { Renderer, marked } from "marked";
5
5
  import chalk from "chalk";
6
+ import { highlightToAnsi } from "../utils/highlightUtils.js";
6
7
  const unescapeHtml = (html) => {
7
8
  return html
8
9
  .replace(/&amp;/g, "&")
@@ -16,7 +17,8 @@ class AnsiRenderer extends Renderer {
16
17
  code({ text, lang }) {
17
18
  const prefix = lang ? `\`\`\`${lang}` : "```";
18
19
  const suffix = "```";
19
- return `\n${chalk.gray(prefix)}\n${text}\n${chalk.gray(suffix)}\n`;
20
+ const highlighted = highlightToAnsi(text, lang);
21
+ return `\n${chalk.gray(prefix)}\n${highlighted}\n${chalk.gray(suffix)}\n`;
20
22
  }
21
23
  blockquote({ tokens }) {
22
24
  const body = this.parser.parse(tokens);
@@ -1 +1 @@
1
- {"version":3,"file":"McpManager.d.ts","sourceRoot":"","sources":["../../src/components/McpManager.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAExC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,eAAe,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1D,kBAAkB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9D;AAED,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAkUhD,CAAC"}
1
+ {"version":3,"file":"McpManager.d.ts","sourceRoot":"","sources":["../../src/components/McpManager.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAExC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,eAAe,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1D,kBAAkB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9D;AAED,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CA0ThD,CAAC"}
@@ -44,64 +44,61 @@ export const McpManager = ({ onCancel, servers, onConnectServer, onDisconnectSer
44
44
  await onDisconnectServer(serverName);
45
45
  };
46
46
  useInput((input, key) => {
47
- if (viewMode === "list") {
48
- // List mode navigation
49
- if (key.return) {
50
- if (servers.length > 0 && selectedIndex < servers.length) {
51
- setViewMode("detail");
47
+ if (key.return) {
48
+ setViewMode((prevMode) => {
49
+ if (prevMode === "list") {
50
+ setSelectedIndex((prevIndex) => {
51
+ if (servers.length > 0 && prevIndex < servers.length) {
52
+ // We can't call setViewMode here because we're already in a setViewMode call
53
+ // But we can return the new mode from the outer setViewMode
54
+ }
55
+ return prevIndex;
56
+ });
57
+ return "detail";
58
+ }
59
+ return prevMode;
60
+ });
61
+ return;
62
+ }
63
+ if (key.escape) {
64
+ setViewMode((prev) => {
65
+ if (prev === "detail") {
66
+ return "list";
52
67
  }
53
- return;
54
- }
55
- if (key.escape) {
56
68
  onCancel();
57
- return;
58
- }
59
- if (key.upArrow) {
60
- setSelectedIndex(Math.max(0, selectedIndex - 1));
61
- return;
62
- }
63
- if (key.downArrow) {
64
- setSelectedIndex(Math.min(servers.length - 1, selectedIndex + 1));
65
- return;
66
- }
67
- // Hotkeys for server actions
68
- if (input === "c" &&
69
- servers.length > 0 &&
70
- selectedIndex < servers.length) {
71
- const server = servers[selectedIndex];
72
- if (server.status === "disconnected" || server.status === "error") {
69
+ return prev;
70
+ });
71
+ return;
72
+ }
73
+ if (key.upArrow) {
74
+ setSelectedIndex((prev) => Math.max(0, prev - 1));
75
+ return;
76
+ }
77
+ if (key.downArrow) {
78
+ setSelectedIndex((prev) => Math.min(servers.length - 1, prev + 1));
79
+ return;
80
+ }
81
+ // Hotkeys for server actions
82
+ if (input === "c") {
83
+ setSelectedIndex((prev) => {
84
+ const server = servers[prev];
85
+ if (server &&
86
+ (server.status === "disconnected" || server.status === "error")) {
73
87
  handleConnect(server.name);
74
88
  }
75
- return;
76
- }
77
- if (input === "d" &&
78
- servers.length > 0 &&
79
- selectedIndex < servers.length) {
80
- const server = servers[selectedIndex];
81
- if (server.status === "connected") {
82
- handleDisconnect(server.name);
83
- }
84
- return;
85
- }
89
+ return prev;
90
+ });
91
+ return;
86
92
  }
87
- else if (viewMode === "detail") {
88
- // Detail mode navigation
89
- if (key.escape) {
90
- setViewMode("list");
91
- return;
92
- }
93
- if (selectedServer) {
94
- if (input === "c" &&
95
- (selectedServer.status === "disconnected" ||
96
- selectedServer.status === "error")) {
97
- handleConnect(selectedServer.name);
98
- return;
99
- }
100
- if (input === "d" && selectedServer.status === "connected") {
101
- handleDisconnect(selectedServer.name);
102
- return;
93
+ if (input === "d") {
94
+ setSelectedIndex((prev) => {
95
+ const server = servers[prev];
96
+ if (server && server.status === "connected") {
97
+ handleDisconnect(server.name);
103
98
  }
104
- }
99
+ return prev;
100
+ });
101
+ return;
105
102
  }
106
103
  });
107
104
  if (viewMode === "detail" && selectedServer) {
@@ -0,0 +1,9 @@
1
+ import type { Message, MessageBlock } from "wave-agent-sdk";
2
+ export interface MessageBlockItemProps {
3
+ block: MessageBlock;
4
+ message: Message;
5
+ isExpanded: boolean;
6
+ paddingTop?: number;
7
+ }
8
+ export declare const MessageBlockItem: ({ block, message, isExpanded, paddingTop, }: MessageBlockItemProps) => import("react/jsx-runtime").JSX.Element;
9
+ //# sourceMappingURL=MessageBlockItem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageBlockItem.d.ts","sourceRoot":"","sources":["../../src/components/MessageBlockItem.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAQ5D,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,gBAAgB,GAAI,6CAK9B,qBAAqB,4CA4DvB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { Box, Text } from "ink";
3
+ import { MessageSource } from "wave-agent-sdk";
4
+ import { CommandOutputDisplay } from "./CommandOutputDisplay.js";
5
+ import { ToolDisplay } from "./ToolDisplay.js";
6
+ import { CompressDisplay } from "./CompressDisplay.js";
7
+ import { ReasoningDisplay } from "./ReasoningDisplay.js";
8
+ import { Markdown } from "./Markdown.js";
9
+ export const MessageBlockItem = ({ block, message, isExpanded, paddingTop = 0, }) => {
10
+ return (_jsxs(Box, { flexDirection: "column", paddingTop: paddingTop, children: [block.type === "text" && block.content.trim() && (_jsxs(Box, { children: [block.customCommandContent && (_jsxs(Text, { color: "cyan", bold: true, children: ["$", " "] })), block.source === MessageSource.HOOK && (_jsxs(Text, { color: "magenta", bold: true, children: ["~", " "] })), message.role === "user" ? (_jsx(Text, { backgroundColor: "gray", color: "white", children: block.content })) : (_jsx(Markdown, { children: block.content }))] })), block.type === "error" && (_jsx(Box, { children: _jsxs(Text, { color: "red", children: ["Error: ", block.content] }) })), block.type === "command_output" && (_jsx(CommandOutputDisplay, { block: block, isExpanded: isExpanded })), block.type === "tool" && (_jsx(ToolDisplay, { block: block, isExpanded: isExpanded })), block.type === "image" && (_jsxs(Box, { children: [_jsx(Text, { color: "magenta", bold: true, children: "# Image" }), block.imageUrls && block.imageUrls.length > 0 && (_jsxs(Text, { color: "gray", dimColor: true, children: [" ", "(", block.imageUrls.length, ")"] }))] })), block.type === "compress" && (_jsx(CompressDisplay, { block: block, isExpanded: isExpanded })), block.type === "reasoning" && _jsx(ReasoningDisplay, { block: block })] }));
11
+ };
@@ -2,10 +2,8 @@ import React from "react";
2
2
  import type { Message } from "wave-agent-sdk";
3
3
  export interface MessageListProps {
4
4
  messages: Message[];
5
- isLoading?: boolean;
6
- isCommandRunning?: boolean;
7
5
  isExpanded?: boolean;
8
- forceStaticLastMessage?: boolean;
6
+ hideDynamicBlocks?: boolean;
9
7
  }
10
- export declare const MessageList: React.MemoExoticComponent<({ messages, isLoading, isCommandRunning, isExpanded, forceStaticLastMessage, }: MessageListProps) => import("react/jsx-runtime").JSX.Element>;
8
+ export declare const MessageList: React.MemoExoticComponent<({ messages, isExpanded, hideDynamicBlocks, }: MessageListProps) => import("react/jsx-runtime").JSX.Element>;
11
9
  //# sourceMappingURL=MessageList.d.ts.map
@@ -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,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,eAAO,MAAM,WAAW,6GAOnB,gBAAgB,6CA4EpB,CAAC"}
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,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,eAAO,MAAM,WAAW,2EAKnB,gBAAgB,6CAmFpB,CAAC"}
@@ -1,8 +1,8 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import React from "react";
3
3
  import { Box, Text, Static } from "ink";
4
- import { MessageItem } from "./MessageItem.js";
5
- export const MessageList = React.memo(({ messages, isLoading = false, isCommandRunning = false, isExpanded = false, forceStaticLastMessage = false, }) => {
4
+ import { MessageBlockItem } from "./MessageBlockItem.js";
5
+ export const MessageList = React.memo(({ messages, isExpanded = false, hideDynamicBlocks = false, }) => {
6
6
  // Empty message state
7
7
  if (messages.length === 0) {
8
8
  return (_jsx(Box, { flexDirection: "column", gap: 1, children: _jsx(Box, { flexDirection: "column", paddingY: 1, children: _jsx(Text, { color: "gray", children: "Welcome to WAVE Code Assistant!" }) }) }));
@@ -13,27 +13,32 @@ export const MessageList = React.memo(({ messages, isLoading = false, isCommandR
13
13
  const displayMessages = shouldLimitMessages
14
14
  ? messages.slice(-maxExpandedMessages)
15
15
  : messages;
16
- // Compute which messages to render statically vs dynamically
17
- const lastMessage = displayMessages[displayMessages.length - 1];
18
- const hasNonEndTool = lastMessage?.blocks.some((block) => block.type === "tool" && block.stage !== "end");
19
- const hasRunningCommand = lastMessage?.blocks.some((block) => block.type === "command_output" && block.isRunning);
20
- const shouldRenderLastDynamic = !forceStaticLastMessage &&
21
- (isLoading || isCommandRunning || hasNonEndTool || hasRunningCommand);
22
- const staticMessages = shouldRenderLastDynamic
23
- ? displayMessages.slice(0, -1)
24
- : displayMessages;
25
- const dynamicMessages = shouldRenderLastDynamic && displayMessages.length > 0
26
- ? [displayMessages[displayMessages.length - 1]]
27
- : [];
28
- return (_jsxs(Box, { flexDirection: "column", paddingBottom: 1, children: [_jsx(Static, { items: staticMessages, children: (message, key) => {
29
- // Get previous message
30
- const previousMessage = key > 0 ? staticMessages[key - 1] : undefined;
31
- return (_jsx(MessageItem, { message: message, shouldShowHeader: previousMessage?.role !== message.role, isExpanded: isExpanded }, key));
32
- } }), dynamicMessages.map((message, index) => {
33
- const messageIndex = staticMessages.length + index;
34
- const previousMessage = messageIndex > 0 ? displayMessages[messageIndex - 1] : undefined;
35
- return (_jsx(Box, { children: _jsx(MessageItem, { message: message, shouldShowHeader: previousMessage?.role !== message.role, isExpanded: isExpanded }) }, `dynamic-${index}`));
36
- })] }));
16
+ // Flatten messages into blocks with metadata
17
+ const allBlocks = displayMessages.flatMap((message, index) => {
18
+ const messageIndex = shouldLimitMessages
19
+ ? messages.length - maxExpandedMessages + index
20
+ : index;
21
+ return message.blocks.map((block, blockIndex) => ({
22
+ block,
23
+ message,
24
+ isLastMessage: messageIndex === messages.length - 1,
25
+ // Unique key for each block to help Static component
26
+ key: `${message.id || messageIndex}-${blockIndex}`,
27
+ }));
28
+ });
29
+ // Determine which blocks are static vs dynamic
30
+ const blocksWithStatus = allBlocks.map((item) => {
31
+ const { block, isLastMessage } = item;
32
+ const isDynamic = isLastMessage &&
33
+ ((block.type === "tool" && block.stage !== "end") ||
34
+ (block.type === "command_output" && block.isRunning));
35
+ return { ...item, isDynamic };
36
+ });
37
+ const staticBlocks = blocksWithStatus.filter((b) => !b.isDynamic);
38
+ const dynamicBlocks = hideDynamicBlocks
39
+ ? []
40
+ : blocksWithStatus.filter((b) => b.isDynamic);
41
+ return (_jsxs(Box, { flexDirection: "column", paddingBottom: 1, children: [staticBlocks.length > 0 && (_jsx(Static, { items: staticBlocks, children: (item) => (_jsx(MessageBlockItem, { block: item.block, message: item.message, isExpanded: isExpanded, paddingTop: 1 }, item.key)) })), dynamicBlocks.length > 0 && (_jsx(Box, { flexDirection: "column", children: dynamicBlocks.map((item) => (_jsx(MessageBlockItem, { block: item.block, message: item.message, isExpanded: isExpanded, paddingTop: 1 }, item.key))) }))] }));
37
42
  });
38
43
  // Add display name for debugging
39
44
  MessageList.displayName = "MessageList";
@@ -1 +1 @@
1
- {"version":3,"file":"PluginDetail.d.ts","sourceRoot":"","sources":["../../src/components/PluginDetail.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAUxC,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAwIhC,CAAC"}
1
+ {"version":3,"file":"PluginDetail.d.ts","sourceRoot":"","sources":["../../src/components/PluginDetail.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAUxC,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAuIhC,CAAC"}
@@ -24,36 +24,33 @@ export const PluginDetail = () => {
24
24
  actions.setView(isFromDiscover ? "DISCOVER" : "INSTALLED");
25
25
  }
26
26
  else if (key.upArrow) {
27
- if (isInstalledAndEnabled) {
28
- setSelectedActionIndex((prev) => prev > 0 ? prev - 1 : INSTALLED_ACTIONS.length - 1);
29
- }
30
- else {
31
- setSelectedScopeIndex((prev) => prev > 0 ? prev - 1 : SCOPES.length - 1);
32
- }
27
+ setSelectedActionIndex((prev) => prev > 0 ? prev - 1 : INSTALLED_ACTIONS.length - 1);
28
+ setSelectedScopeIndex((prev) => prev > 0 ? prev - 1 : SCOPES.length - 1);
33
29
  }
34
30
  else if (key.downArrow) {
35
- if (isInstalledAndEnabled) {
36
- setSelectedActionIndex((prev) => prev < INSTALLED_ACTIONS.length - 1 ? prev + 1 : 0);
37
- }
38
- else {
39
- setSelectedScopeIndex((prev) => prev < SCOPES.length - 1 ? prev + 1 : 0);
40
- }
31
+ setSelectedActionIndex((prev) => prev < INSTALLED_ACTIONS.length - 1 ? prev + 1 : 0);
32
+ setSelectedScopeIndex((prev) => prev < SCOPES.length - 1 ? prev + 1 : 0);
41
33
  }
42
34
  else if (key.return && plugin) {
43
35
  if (isInstalledAndEnabled) {
44
- const action = INSTALLED_ACTIONS[selectedActionIndex].id;
45
- if (action === "uninstall") {
46
- actions.uninstallPlugin(plugin.name, plugin.marketplace);
47
- }
48
- else {
49
- actions.updatePlugin(plugin.name, plugin.marketplace);
50
- }
51
- actions.setView("INSTALLED");
36
+ setSelectedActionIndex((prev) => {
37
+ const action = INSTALLED_ACTIONS[prev].id;
38
+ if (action === "uninstall") {
39
+ actions.uninstallPlugin(plugin.name, plugin.marketplace);
40
+ }
41
+ else {
42
+ actions.updatePlugin(plugin.name, plugin.marketplace);
43
+ }
44
+ return prev;
45
+ });
52
46
  }
53
47
  else {
54
- actions.installPlugin(plugin.name, plugin.marketplace, SCOPES[selectedScopeIndex].id);
55
- actions.setView("INSTALLED");
48
+ setSelectedScopeIndex((prev) => {
49
+ actions.installPlugin(plugin.name, plugin.marketplace, SCOPES[prev].id);
50
+ return prev;
51
+ });
56
52
  }
53
+ actions.setView("INSTALLED");
57
54
  }
58
55
  });
59
56
  if (!plugin) {
@@ -1 +1 @@
1
- {"version":3,"file":"SessionSelector.d.ts","sourceRoot":"","sources":["../../src/components/SessionSelector.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAExC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEtD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,CAAC,eAAe,GAAG;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAC;IAC1D,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAoH1D,CAAC"}
1
+ {"version":3,"file":"SessionSelector.d.ts","sourceRoot":"","sources":["../../src/components/SessionSelector.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAExC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEtD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,CAAC,eAAe,GAAG;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAC;IAC1D,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAuH1D,CAAC"}
@@ -5,9 +5,12 @@ export const SessionSelector = ({ sessions, onSelect, onCancel, }) => {
5
5
  const [selectedIndex, setSelectedIndex] = useState(0);
6
6
  useInput((input, key) => {
7
7
  if (key.return) {
8
- if (sessions.length > 0 && selectedIndex < sessions.length) {
9
- onSelect(sessions[selectedIndex].id);
10
- }
8
+ setSelectedIndex((prev) => {
9
+ if (sessions.length > 0 && prev < sessions.length) {
10
+ onSelect(sessions[prev].id);
11
+ }
12
+ return prev;
13
+ });
11
14
  return;
12
15
  }
13
16
  if (key.escape) {
@@ -15,11 +18,11 @@ export const SessionSelector = ({ sessions, onSelect, onCancel, }) => {
15
18
  return;
16
19
  }
17
20
  if (key.upArrow) {
18
- setSelectedIndex(Math.max(0, selectedIndex - 1));
21
+ setSelectedIndex((prev) => Math.max(0, prev - 1));
19
22
  return;
20
23
  }
21
24
  if (key.downArrow) {
22
- setSelectedIndex(Math.min(sessions.length - 1, selectedIndex + 1));
25
+ setSelectedIndex((prev) => Math.min(sessions.length - 1, prev + 1));
23
26
  return;
24
27
  }
25
28
  });
@@ -1 +1 @@
1
- {"version":3,"file":"TaskList.d.ts","sourceRoot":"","sources":["../../src/components/TaskList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAK1B,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAoD5B,CAAC"}
1
+ {"version":3,"file":"TaskList.d.ts","sourceRoot":"","sources":["../../src/components/TaskList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAK1B,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAiD5B,CAAC"}
@@ -8,10 +8,7 @@ export const TaskList = () => {
8
8
  if (tasks.length === 0 || !isTaskListVisible) {
9
9
  return null;
10
10
  }
11
- const getStatusIcon = (status, isBlocked) => {
12
- if (isBlocked) {
13
- return _jsx(Text, { color: "red", children: "\uD83D\uDD12" });
14
- }
11
+ const getStatusIcon = (status) => {
15
12
  switch (status) {
16
13
  case "pending":
17
14
  return _jsx(Text, { color: "gray", children: "\u25A1" });
@@ -35,6 +32,6 @@ export const TaskList = () => {
35
32
  ? ` (Blocked by: ${blockingTaskIds.join(", ")})`
36
33
  : "";
37
34
  const fullText = `${task.subject}${blockedByText}`;
38
- return (_jsxs(Box, { gap: 1, children: [getStatusIcon(task.status, isBlocked), _jsx(Text, { dimColor: isDimmed, children: fullText })] }, task.id));
35
+ return (_jsxs(Box, { gap: 1, children: [getStatusIcon(task.status), _jsx(Text, { dimColor: isDimmed, children: fullText })] }, task.id));
39
36
  }) }));
40
37
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ToolDisplay.d.ts","sourceRoot":"","sources":["../../src/components/ToolDisplay.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhD,UAAU,gBAAgB;IACxB,KAAK,EAAE,SAAS,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CA+HlD,CAAC"}
1
+ {"version":3,"file":"ToolDisplay.d.ts","sourceRoot":"","sources":["../../src/components/ToolDisplay.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhD,UAAU,gBAAgB;IACxB,KAAK,EAAE,SAAS,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAmIlD,CAAC"}
@@ -40,5 +40,5 @@ export const ToolDisplay = ({ block, isExpanded = false, }) => {
40
40
  return null;
41
41
  };
42
42
  const shortResult = getShortResult();
43
- return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { children: [_jsxs(Box, { flexShrink: 0, children: [_jsx(Text, { color: getStatusColor(), children: "\u25CF " }), _jsx(Text, { color: "white", children: toolName })] }), !isExpanded && compactParams && (_jsxs(Text, { color: "gray", children: [" ", compactParams] })), 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: "gray", 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)] }) })), stage === "end" && success && (_jsx(DiffDisplay, { toolName: name, parameters: parameters }))] }));
43
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { children: [_jsxs(Box, { flexShrink: 0, children: [_jsx(Text, { color: getStatusColor(), children: "\u25CF " }), _jsx(Text, { color: "white", children: toolName })] }), !isExpanded && compactParams && (_jsxs(Text, { color: "gray", children: [" ", compactParams] })), 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: "gray", 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)] }) })), stage === "end" && success && (_jsx(DiffDisplay, { toolName: name, parameters: parameters, startLineNumber: block.startLineNumber }))] }));
44
44
  };
@@ -58,6 +58,7 @@ export interface ChatProviderProps {
58
58
  children: React.ReactNode;
59
59
  bypassPermissions?: boolean;
60
60
  pluginDirs?: string[];
61
+ tools?: string[];
61
62
  }
62
63
  export declare const ChatProvider: React.FC<ChatProviderProps>;
63
64
  //# sourceMappingURL=useChat.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useChat.d.ts","sourceRoot":"","sources":["../../src/contexts/useChat.tsx"],"names":[],"mappings":"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"}
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,cAAc,EACd,IAAI,EACJ,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;IAEvB,UAAU,EAAE,OAAO,CAAC;IACpB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,oBAAoB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAEjD,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,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,eAAe,EAAE,cAAc,EAAE,CAAC;IAElC,YAAY,EAAE,IAAI,EAAE,CAAC;IACrB,uBAAuB,EAAE,CACvB,MAAM,EAAE,MAAM,KACX;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC/D,kBAAkB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;IAEhD,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;IAC5C,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE7C,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;QACf,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChC,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,oBAAoB,CAAC,EAAE,OAAO,CAAC;KAChC,CAAC;IACF,gBAAgB,EAAE,CAChB,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,eAAe,CAAC,EAAE,MAAM,EACxB,oBAAoB,CAAC,EAAE,OAAO,KAC3B,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;IAErC,qBAAqB,EAAE,MAAM,IAAI,CAAC;IAElC,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,oBAAoB,EAAE,MAAM,OAAO,CAAC;QAClC,QAAQ,EAAE,OAAO,EAAE,CAAC;QACpB,UAAU,EAAE,MAAM,EAAE,CAAC;KACtB,CAAC,CAAC;IACH,qBAAqB,EAAE,MAAM,CAAC;IAC9B,wBAAwB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;CACxE;AAID,eAAO,MAAM,OAAO,uBAMnB,CAAC;AAEF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAyfpD,CAAC"}
@@ -13,7 +13,7 @@ export const useChat = () => {
13
13
  }
14
14
  return context;
15
15
  };
16
- export const ChatProvider = ({ children, bypassPermissions, pluginDirs, }) => {
16
+ export const ChatProvider = ({ children, bypassPermissions, pluginDirs, tools, }) => {
17
17
  const { restoreSessionId, continueLastSession } = useAppConfig();
18
18
  // Message Display State
19
19
  const [isExpanded, setIsExpanded] = useState(false);
@@ -24,6 +24,7 @@ export const ChatProvider = ({ children, bypassPermissions, pluginDirs, }) => {
24
24
  const [isTaskListVisible, setIsTaskListVisible] = useState(true);
25
25
  // AI State
26
26
  const [messages, setMessages] = useState([]);
27
+ const messagesUpdateTimerRef = useRef(null);
27
28
  const [isLoading, setIsLoading] = useState(false);
28
29
  const [latestTotalTokens, setlatestTotalTokens] = useState(0);
29
30
  const [sessionId, setSessionId] = useState("");
@@ -71,9 +72,16 @@ export const ChatProvider = ({ children, bypassPermissions, pluginDirs, }) => {
71
72
  useEffect(() => {
72
73
  const initializeAgent = async () => {
73
74
  const callbacks = {
74
- onMessagesChange: (newMessages) => {
75
+ onMessagesChange: () => {
75
76
  if (!isExpandedRef.current) {
76
- setMessages([...newMessages]);
77
+ if (!messagesUpdateTimerRef.current) {
78
+ messagesUpdateTimerRef.current = setTimeout(() => {
79
+ if (agentRef.current) {
80
+ setMessages([...agentRef.current.messages]);
81
+ }
82
+ messagesUpdateTimerRef.current = null;
83
+ }, 50);
84
+ }
77
85
  }
78
86
  },
79
87
  onServersChange: (servers) => {
@@ -139,6 +147,7 @@ export const ChatProvider = ({ children, bypassPermissions, pluginDirs, }) => {
139
147
  canUseTool: permissionCallback,
140
148
  stream: false, // 关闭流式模式
141
149
  plugins: pluginDirs?.map((path) => ({ type: "local", path })),
150
+ tools,
142
151
  });
143
152
  agentRef.current = agent;
144
153
  // Get initial state
@@ -167,10 +176,14 @@ export const ChatProvider = ({ children, bypassPermissions, pluginDirs, }) => {
167
176
  bypassPermissions,
168
177
  showConfirmation,
169
178
  pluginDirs,
179
+ tools,
170
180
  ]);
171
181
  // Cleanup on unmount
172
182
  useEffect(() => {
173
183
  return () => {
184
+ if (messagesUpdateTimerRef.current) {
185
+ clearTimeout(messagesUpdateTimerRef.current);
186
+ }
174
187
  if (agentRef.current) {
175
188
  try {
176
189
  // Display usage summary before cleanup
@@ -330,6 +343,10 @@ export const ChatProvider = ({ children, bypassPermissions, pluginDirs, }) => {
330
343
  setIsExpanded((prev) => {
331
344
  const newExpanded = !prev;
332
345
  if (newExpanded) {
346
+ if (messagesUpdateTimerRef.current) {
347
+ clearTimeout(messagesUpdateTimerRef.current);
348
+ messagesUpdateTimerRef.current = null;
349
+ }
333
350
  // Transitioning to EXPANDED: Freeze the current view
334
351
  // Deep copy the last message to ensure it doesn't update if the agent is still writing to it
335
352
  setMessages((currentMessages) => {
@@ -1 +1 @@
1
- {"version":3,"file":"usePluginManager.d.ts","sourceRoot":"","sources":["../../src/hooks/usePluginManager.ts"],"names":[],"mappings":"AAUA,OAAO,EAGL,wBAAwB,EACzB,MAAM,qCAAqC,CAAC;AAE7C,wBAAgB,gBAAgB,IAAI,wBAAwB,CA6R3D"}
1
+ {"version":3,"file":"usePluginManager.d.ts","sourceRoot":"","sources":["../../src/hooks/usePluginManager.ts"],"names":[],"mappings":"AAOA,OAAO,EAGL,wBAAwB,EACzB,MAAM,qCAAqC,CAAC;AAE7C,wBAAgB,gBAAgB,IAAI,wBAAwB,CA4P3D"}