wave-code 0.12.4 → 0.12.5

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/dist/acp/agent.js CHANGED
@@ -249,7 +249,7 @@ export class WaveAcpAgent {
249
249
  });
250
250
  }
251
251
  }
252
- const textContent = textBlocks.join("");
252
+ const textContent = textBlocks.join("\n");
253
253
  try {
254
254
  await agent.sendMessage(textContent, images.length > 0 ? images : undefined);
255
255
  logger.info(`Message sent successfully for session ${sessionId}`);
@@ -1 +1 @@
1
- {"version":3,"file":"ChatInterface.d.ts","sourceRoot":"","sources":["../../src/components/ChatInterface.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAc3D,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAmIjC,CAAC"}
1
+ {"version":3,"file":"ChatInterface.d.ts","sourceRoot":"","sources":["../../src/components/ChatInterface.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAc3D,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAiIjC,CAAC"}
@@ -17,7 +17,7 @@ export const ChatInterface = () => {
17
17
  const { stdout } = useStdout();
18
18
  const terminalHeight = stdout?.rows ?? 24;
19
19
  const chatInterfaceRef = useRef(null);
20
- const prevForceStatic = useRef(forceStatic);
20
+ // Handle forceStatic mode for overflow and request remount when exiting
21
21
  useEffect(() => {
22
22
  if (isConfirmationVisible && chatInterfaceRef.current) {
23
23
  const { height } = measureElement(chatInterfaceRef.current);
@@ -25,18 +25,17 @@ export const ChatInterface = () => {
25
25
  setForceStatic(true);
26
26
  }
27
27
  }
28
- else {
28
+ else if (forceStatic && !hasPendingConfirmations) {
29
29
  setForceStatic(false);
30
- }
31
- }, [isConfirmationVisible, terminalHeight]);
32
- // Handle forceStatic transition - request remount when transitioning from true to false
33
- // AND there are no more pending confirmations in the queue
34
- useEffect(() => {
35
- if (prevForceStatic.current && !forceStatic && !hasPendingConfirmations) {
36
30
  requestRemount();
37
31
  }
38
- prevForceStatic.current = forceStatic;
39
- }, [forceStatic, hasPendingConfirmations, requestRemount]);
32
+ }, [
33
+ isConfirmationVisible,
34
+ terminalHeight,
35
+ forceStatic,
36
+ hasPendingConfirmations,
37
+ requestRemount,
38
+ ]);
40
39
  if (!sessionId)
41
40
  return null;
42
41
  return (_jsxs(Box, { ref: chatInterfaceRef, flexDirection: "column", children: [_jsx(MessageList, { messages: displayMessages, isExpanded: isExpanded, version: version, workdir: workdir, forceStatic: forceStatic }, remountKey), !isConfirmationVisible && !isExpanded && (_jsxs(_Fragment, { children: [_jsx(BtwDisplay, { btwState: btwState }), (isLoading || isCommandRunning || isCompressing) && (_jsx(LoadingIndicator, { isLoading: isLoading, isCommandRunning: isCommandRunning, isCompressing: isCompressing, latestTotalTokens: latestTotalTokens })), _jsx(TaskList, {}), _jsx(QueuedMessageList, {}), _jsx(InputBox, { isLoading: isLoading, isCommandRunning: isCommandRunning, sendMessage: sendMessage, abortMessage: abortMessage, mcpServers: mcpServers, connectMcpServer: connectMcpServer, disconnectMcpServer: disconnectMcpServer, slashCommands: slashCommands, hasSlashCommand: hasSlashCommand })] })), isConfirmationVisible && (_jsxs(_Fragment, { children: [forceStatic ? (_jsx(Static, { items: [{ key: "confirmation-details" }], children: () => (_jsx(ConfirmationDetails, { toolName: confirmingTool.name, toolInput: confirmingTool.input, planContent: confirmingTool.planContent, isExpanded: isExpanded })) })) : (_jsx(ConfirmationDetails, { toolName: confirmingTool.name, toolInput: confirmingTool.input, planContent: confirmingTool.planContent, isExpanded: isExpanded })), _jsx(ConfirmationSelector, { toolName: confirmingTool.name, toolInput: confirmingTool.input, suggestedPrefix: confirmingTool.suggestedPrefix, hidePersistentOption: confirmingTool.hidePersistentOption, isExpanded: isExpanded, onDecision: handleConfirmationDecision, onCancel: handleConfirmationCancel, onAbort: abortMessage })] }))] }));
@@ -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":"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"}
@@ -65,29 +65,24 @@ export const ChatProvider = ({ children, bypassPermissions, permissionMode: init
65
65
  const [currentConfirmation, setCurrentConfirmation] = useState(null);
66
66
  // Remount state
67
67
  const [remountKey, setRemountKey] = useState(0);
68
- const prevRemountKey = useRef(remountKey);
69
68
  const prevSessionId = useRef(null);
69
+ const requestRemount = useCallback(() => {
70
+ logger.info("requesting remount");
71
+ stdout?.write("\u001b[2J\u001b[3J\u001b[0;0H", () => {
72
+ setRemountKey((prev) => prev + 1);
73
+ });
74
+ }, [stdout]);
70
75
  // Track sessionId changes to trigger remount
71
76
  useEffect(() => {
72
77
  if (prevSessionId.current &&
73
78
  sessionId &&
74
79
  prevSessionId.current !== sessionId) {
75
- setRemountKey((prev) => prev + 1);
80
+ requestRemount();
76
81
  }
77
82
  if (sessionId) {
78
83
  prevSessionId.current = sessionId;
79
84
  }
80
- }, [sessionId]);
81
- // Clear terminal when remountKey changes
82
- useEffect(() => {
83
- if (remountKey !== prevRemountKey.current && prevRemountKey.current !== 0) {
84
- stdout?.write("\u001b[2J\u001b[3J\u001b[0;0H");
85
- }
86
- prevRemountKey.current = remountKey;
87
- }, [remountKey, stdout]);
88
- const requestRemount = useCallback(() => {
89
- setRemountKey((prev) => prev + 1);
90
- }, []);
85
+ }, [sessionId, requestRemount]);
91
86
  // Status metadata state
92
87
  const [workingDirectory, setWorkingDirectory] = useState("");
93
88
  // /btw state
@@ -394,13 +389,13 @@ export const ChatProvider = ({ children, bypassPermissions, permissionMode: init
394
389
  if (agentRef.current) {
395
390
  try {
396
391
  await agentRef.current.truncateHistory(index);
397
- setRemountKey((prev) => prev + 1);
392
+ requestRemount();
398
393
  }
399
394
  catch (error) {
400
395
  logger.error("Failed to rewind:", error);
401
396
  }
402
397
  }
403
- }, []);
398
+ }, [requestRemount]);
404
399
  const getFullMessageThread = useCallback(async () => {
405
400
  if (agentRef.current) {
406
401
  return await agentRef.current.getFullMessageThread();
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAgBA,wBAAsB,IAAI,kBAgYzB;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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAeA,wBAAsB,IAAI,kBAoXzB;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,6 @@
1
1
  import yargs from "yargs";
2
2
  import { hideBin } from "yargs/helpers";
3
3
  import { startCli } from "./cli.js";
4
- import { logger } from "./utils/logger.js";
5
4
  import { generateRandomName } from "wave-agent-sdk";
6
5
  import { createWorktree } from "./utils/worktree.js";
7
6
  import path from "path";
@@ -13,15 +12,6 @@ const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf-8"));
13
12
  const version = packageJson.version;
14
13
  // Export main function for external use
15
14
  export async function main() {
16
- // Start memory monitoring in debug mode
17
- if (process.env.LOG_LEVEL === "DEBUG") {
18
- setInterval(() => {
19
- const usage = process.memoryUsage();
20
- logger.debug(`[Memory] RSS: ${Math.round(usage.rss / 1024 / 1024)}MB, ` +
21
- `Heap: ${Math.round(usage.heapUsed / 1024 / 1024)}/${Math.round(usage.heapTotal / 1024 / 1024)}MB, ` +
22
- `External: ${Math.round(usage.external / 1024 / 1024)}MB`);
23
- }, 10000).unref();
24
- }
25
15
  try {
26
16
  const originalCwd = process.cwd();
27
17
  const argv = await yargs(hideBin(process.argv))
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wave-code",
3
- "version": "0.12.4",
3
+ "version": "0.12.5",
4
4
  "description": "CLI-based code assistant powered by AI, built with React and Ink",
5
5
  "repository": {
6
6
  "type": "git",
@@ -42,7 +42,7 @@
42
42
  "semver": "^7.7.4",
43
43
  "yargs": "^17.7.2",
44
44
  "zod": "^3.23.8",
45
- "wave-agent-sdk": "0.12.4"
45
+ "wave-agent-sdk": "0.12.5"
46
46
  },
47
47
  "devDependencies": {
48
48
  "@types/react": "^19.1.8",
package/src/acp/agent.ts CHANGED
@@ -360,7 +360,7 @@ export class WaveAcpAgent implements AcpAgent {
360
360
  }
361
361
  }
362
362
 
363
- const textContent = textBlocks.join("");
363
+ const textContent = textBlocks.join("\n");
364
364
 
365
365
  try {
366
366
  await agent.sendMessage(
@@ -46,27 +46,25 @@ export const ChatInterface: React.FC = () => {
46
46
  const { stdout } = useStdout();
47
47
  const terminalHeight = stdout?.rows ?? 24;
48
48
  const chatInterfaceRef = useRef<DOMElement>(null);
49
- const prevForceStatic = useRef(forceStatic);
50
49
 
50
+ // Handle forceStatic mode for overflow and request remount when exiting
51
51
  useEffect(() => {
52
52
  if (isConfirmationVisible && chatInterfaceRef.current) {
53
53
  const { height } = measureElement(chatInterfaceRef.current);
54
54
  if (height > terminalHeight) {
55
55
  setForceStatic(true);
56
56
  }
57
- } else {
57
+ } else if (forceStatic && !hasPendingConfirmations) {
58
58
  setForceStatic(false);
59
- }
60
- }, [isConfirmationVisible, terminalHeight]);
61
-
62
- // Handle forceStatic transition - request remount when transitioning from true to false
63
- // AND there are no more pending confirmations in the queue
64
- useEffect(() => {
65
- if (prevForceStatic.current && !forceStatic && !hasPendingConfirmations) {
66
59
  requestRemount();
67
60
  }
68
- prevForceStatic.current = forceStatic;
69
- }, [forceStatic, hasPendingConfirmations, requestRemount]);
61
+ }, [
62
+ isConfirmationVisible,
63
+ terminalHeight,
64
+ forceStatic,
65
+ hasPendingConfirmations,
66
+ requestRemount,
67
+ ]);
70
68
 
71
69
  if (!sessionId) return null;
72
70
 
@@ -256,9 +256,15 @@ export const ChatProvider: React.FC<ChatProviderProps> = ({
256
256
 
257
257
  // Remount state
258
258
  const [remountKey, setRemountKey] = useState(0);
259
- const prevRemountKey = useRef(remountKey);
260
259
  const prevSessionId = useRef<string | null>(null);
261
260
 
261
+ const requestRemount = useCallback(() => {
262
+ logger.info("requesting remount");
263
+ stdout?.write("\u001b[2J\u001b[3J\u001b[0;0H", () => {
264
+ setRemountKey((prev) => prev + 1);
265
+ });
266
+ }, [stdout]);
267
+
262
268
  // Track sessionId changes to trigger remount
263
269
  useEffect(() => {
264
270
  if (
@@ -266,24 +272,12 @@ export const ChatProvider: React.FC<ChatProviderProps> = ({
266
272
  sessionId &&
267
273
  prevSessionId.current !== sessionId
268
274
  ) {
269
- setRemountKey((prev) => prev + 1);
275
+ requestRemount();
270
276
  }
271
277
  if (sessionId) {
272
278
  prevSessionId.current = sessionId;
273
279
  }
274
- }, [sessionId]);
275
-
276
- // Clear terminal when remountKey changes
277
- useEffect(() => {
278
- if (remountKey !== prevRemountKey.current && prevRemountKey.current !== 0) {
279
- stdout?.write("\u001b[2J\u001b[3J\u001b[0;0H");
280
- }
281
- prevRemountKey.current = remountKey;
282
- }, [remountKey, stdout]);
283
-
284
- const requestRemount = useCallback(() => {
285
- setRemountKey((prev) => prev + 1);
286
- }, []);
280
+ }, [sessionId, requestRemount]);
287
281
 
288
282
  // Status metadata state
289
283
  const [workingDirectory, setWorkingDirectory] = useState("");
@@ -655,16 +649,19 @@ export const ChatProvider: React.FC<ChatProviderProps> = ({
655
649
  agentRef.current?.backgroundCurrentTask();
656
650
  }, []);
657
651
 
658
- const handleRewindSelect = useCallback(async (index: number) => {
659
- if (agentRef.current) {
660
- try {
661
- await agentRef.current.truncateHistory(index);
662
- setRemountKey((prev) => prev + 1);
663
- } catch (error) {
664
- logger.error("Failed to rewind:", error);
652
+ const handleRewindSelect = useCallback(
653
+ async (index: number) => {
654
+ if (agentRef.current) {
655
+ try {
656
+ await agentRef.current.truncateHistory(index);
657
+ requestRemount();
658
+ } catch (error) {
659
+ logger.error("Failed to rewind:", error);
660
+ }
665
661
  }
666
- }
667
- }, []);
662
+ },
663
+ [requestRemount],
664
+ );
668
665
 
669
666
  const getFullMessageThread = useCallback(async () => {
670
667
  if (agentRef.current) {
package/src/index.ts CHANGED
@@ -1,7 +1,6 @@
1
1
  import yargs from "yargs";
2
2
  import { hideBin } from "yargs/helpers";
3
3
  import { startCli } from "./cli.js";
4
- import { logger } from "./utils/logger.js";
5
4
  import { Scope, generateRandomName, type PermissionMode } from "wave-agent-sdk";
6
5
  import { createWorktree, type WorktreeSession } from "./utils/worktree.js";
7
6
  import path from "path";
@@ -15,18 +14,6 @@ const version = packageJson.version;
15
14
 
16
15
  // Export main function for external use
17
16
  export async function main() {
18
- // Start memory monitoring in debug mode
19
- if (process.env.LOG_LEVEL === "DEBUG") {
20
- setInterval(() => {
21
- const usage = process.memoryUsage();
22
- logger.debug(
23
- `[Memory] RSS: ${Math.round(usage.rss / 1024 / 1024)}MB, ` +
24
- `Heap: ${Math.round(usage.heapUsed / 1024 / 1024)}/${Math.round(usage.heapTotal / 1024 / 1024)}MB, ` +
25
- `External: ${Math.round(usage.external / 1024 / 1024)}MB`,
26
- );
27
- }, 10000).unref();
28
- }
29
-
30
17
  try {
31
18
  const originalCwd = process.cwd();
32
19
  const argv = await yargs(hideBin(process.argv))