wave-code 0.16.10 → 0.16.13
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/components/MessageList.d.ts.map +1 -1
- package/dist/components/MessageList.js +5 -2
- package/dist/contexts/useChat.d.ts.map +1 -1
- package/dist/contexts/useChat.js +6 -3
- package/dist/utils/worktree.d.ts.map +1 -1
- package/dist/utils/worktree.js +45 -0
- package/package.json +4 -4
- package/src/components/MessageList.tsx +7 -3
- package/src/contexts/useChat.tsx +6 -3
- package/src/utils/worktree.ts +50 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageList.d.ts","sourceRoot":"","sources":["../../src/components/MessageList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,OAAO,EAAgB,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"MessageList.d.ts","sourceRoot":"","sources":["../../src/components/MessageList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,OAAO,EAAgB,MAAM,gBAAgB,CAAC;AAM5D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,WAAW,uFAOnB,gBAAgB,6CAkIpB,CAAC"}
|
|
@@ -3,10 +3,13 @@ import React from "react";
|
|
|
3
3
|
import os from "os";
|
|
4
4
|
import { Box, Text, Static } from "ink";
|
|
5
5
|
import { MessageBlockItem } from "./MessageBlockItem.js";
|
|
6
|
+
const MAX_MESSAGES_COLLAPSED = 30;
|
|
7
|
+
const MAX_MESSAGES_EXPANDED = 10;
|
|
6
8
|
export const MessageList = React.memo(({ messages, isExpanded = false, forceStatic = false, version, workdir, }) => {
|
|
9
|
+
const maxMessages = isExpanded
|
|
10
|
+
? MAX_MESSAGES_EXPANDED
|
|
11
|
+
: MAX_MESSAGES_COLLAPSED;
|
|
7
12
|
const welcomeMessage = (_jsxs(Box, { flexDirection: "column", paddingTop: 1, children: [_jsxs(Text, { color: "gray", children: ["WAVE", version ? ` v${version}` : ""] }), workdir && (_jsx(Text, { color: "gray", wrap: "truncate-middle", children: workdir.replace(os.homedir(), "~") }))] }));
|
|
8
|
-
// Limit messages to prevent long rendering times
|
|
9
|
-
const maxMessages = 10;
|
|
10
13
|
// Filter out meta messages
|
|
11
14
|
const visibleMessages = messages.filter((m) => !m.isMeta);
|
|
12
15
|
const isRunning = (b) => (b.type === "tool" &&
|
|
@@ -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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"}
|
package/dist/contexts/useChat.js
CHANGED
|
@@ -431,7 +431,6 @@ export const ChatProvider = ({ children, bypassPermissions, permissionMode: init
|
|
|
431
431
|
// Listen for Ctrl+O hotkey to toggle collapse/expand state and ESC to cancel confirmation
|
|
432
432
|
useInput((input, key) => {
|
|
433
433
|
if (key.ctrl && input === "o") {
|
|
434
|
-
// Clear terminal screen when expanded state changes
|
|
435
434
|
// Use ref to get the current value to avoid stale closure
|
|
436
435
|
const nextExpanded = !isExpandedRef.current;
|
|
437
436
|
setIsExpanded(nextExpanded);
|
|
@@ -449,8 +448,12 @@ export const ChatProvider = ({ children, bypassPermissions, permissionMode: init
|
|
|
449
448
|
setLatestTotalTokens(extractLatestTotalTokens(msgs));
|
|
450
449
|
}
|
|
451
450
|
}
|
|
452
|
-
// Force remount to
|
|
453
|
-
requestRemount
|
|
451
|
+
// Force remount directly (bypass throttle) to ensure Static items re-render
|
|
452
|
+
// The throttled requestRemount can be dropped if pressed too quickly after
|
|
453
|
+
// a previous remount, leaving the UI stuck without a visual update
|
|
454
|
+
stdout?.write("\u001b[2J\u001b[3J\u001b[0;0H", () => {
|
|
455
|
+
setRemountKey((prev) => prev + 1);
|
|
456
|
+
});
|
|
454
457
|
}
|
|
455
458
|
if (key.ctrl && input === "t") {
|
|
456
459
|
setIsTaskListVisible((prev) => !prev);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worktree.d.ts","sourceRoot":"","sources":["../../src/utils/worktree.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,qBAAqB,EAAE,OAAO,CAAC;IAC/B,aAAa,EAAE,OAAO,CAAC;IACvB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,eAAe,
|
|
1
|
+
{"version":3,"file":"worktree.d.ts","sourceRoot":"","sources":["../../src/utils/worktree.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,qBAAqB,EAAE,OAAO,CAAC;IAC/B,aAAa,EAAE,OAAO,CAAC;IACvB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,eAAe,CA2HzE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CA6D7D"}
|
package/dist/utils/worktree.js
CHANGED
|
@@ -70,6 +70,51 @@ export function createWorktree(name, cwd) {
|
|
|
70
70
|
throw new Error(`Failed to add existing worktree branch: ${innerError.message}`);
|
|
71
71
|
}
|
|
72
72
|
}
|
|
73
|
+
if (stderr.includes("not a valid object name") ||
|
|
74
|
+
stderr.includes("unknown revision")) {
|
|
75
|
+
// Base branch not fetched yet — try fetching then retrying
|
|
76
|
+
const branchNameOnly = baseBranch.split("/").pop();
|
|
77
|
+
try {
|
|
78
|
+
execSync(`git fetch origin ${branchNameOnly}`, {
|
|
79
|
+
cwd: repoRoot,
|
|
80
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
81
|
+
});
|
|
82
|
+
execSync(`git worktree add -b ${branchName} "${worktreePath}" ${baseBranch}`, {
|
|
83
|
+
cwd: repoRoot,
|
|
84
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
85
|
+
});
|
|
86
|
+
return {
|
|
87
|
+
name,
|
|
88
|
+
path: worktreePath,
|
|
89
|
+
branch: branchName,
|
|
90
|
+
repoRoot,
|
|
91
|
+
hasUncommittedChanges: false,
|
|
92
|
+
hasNewCommits: false,
|
|
93
|
+
isNew: true,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
// Fetch or retry failed — fall back to HEAD
|
|
98
|
+
try {
|
|
99
|
+
execSync(`git worktree add -b ${branchName} "${worktreePath}" HEAD`, {
|
|
100
|
+
cwd: repoRoot,
|
|
101
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
102
|
+
});
|
|
103
|
+
return {
|
|
104
|
+
name,
|
|
105
|
+
path: worktreePath,
|
|
106
|
+
branch: branchName,
|
|
107
|
+
repoRoot,
|
|
108
|
+
hasUncommittedChanges: false,
|
|
109
|
+
hasNewCommits: false,
|
|
110
|
+
isNew: true,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
throw new Error(`Failed to create worktree: ${error.message}\n${stderr}`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
73
118
|
throw new Error(`Failed to create worktree: ${error.message}\n${stderr}`);
|
|
74
119
|
}
|
|
75
120
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "wave-code",
|
|
3
|
-
"version": "0.16.
|
|
3
|
+
"version": "0.16.13",
|
|
4
4
|
"description": "CLI-based code assistant powered by AI, built with React and Ink",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -42,20 +42,20 @@
|
|
|
42
42
|
"semver": "^7.7.4",
|
|
43
43
|
"yargs": "^17.7.2",
|
|
44
44
|
"zod": "^3.23.8",
|
|
45
|
-
"wave-agent-sdk": "0.16.
|
|
45
|
+
"wave-agent-sdk": "0.16.13"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
48
|
"@types/react": "^19.1.8",
|
|
49
49
|
"@types/semver": "^7.7.1",
|
|
50
50
|
"@types/yargs": "^17.0.0",
|
|
51
|
-
"@vitest/coverage-v8": "^4.
|
|
51
|
+
"@vitest/coverage-v8": "^4.1.7",
|
|
52
52
|
"eslint-plugin-react": "^7.37.5",
|
|
53
53
|
"eslint-plugin-react-hooks": "^5.2.0",
|
|
54
54
|
"ink-testing-library": "^4.0.0",
|
|
55
55
|
"rimraf": "^6.1.2",
|
|
56
56
|
"tsc-alias": "^1.8.16",
|
|
57
57
|
"tsx": "^4.20.4",
|
|
58
|
-
"vitest": "^4.
|
|
58
|
+
"vitest": "^4.1.7"
|
|
59
59
|
},
|
|
60
60
|
"peerDependencies": {
|
|
61
61
|
"react": ">=18.0.0"
|
|
@@ -4,6 +4,9 @@ import { Box, Text, Static } from "ink";
|
|
|
4
4
|
import type { Message, MessageBlock } from "wave-agent-sdk";
|
|
5
5
|
import { MessageBlockItem } from "./MessageBlockItem.js";
|
|
6
6
|
|
|
7
|
+
const MAX_MESSAGES_COLLAPSED = 30;
|
|
8
|
+
const MAX_MESSAGES_EXPANDED = 10;
|
|
9
|
+
|
|
7
10
|
export interface MessageListProps {
|
|
8
11
|
messages: Message[];
|
|
9
12
|
isExpanded?: boolean;
|
|
@@ -20,6 +23,10 @@ export const MessageList = React.memo(
|
|
|
20
23
|
version,
|
|
21
24
|
workdir,
|
|
22
25
|
}: MessageListProps) => {
|
|
26
|
+
const maxMessages = isExpanded
|
|
27
|
+
? MAX_MESSAGES_EXPANDED
|
|
28
|
+
: MAX_MESSAGES_COLLAPSED;
|
|
29
|
+
|
|
23
30
|
const welcomeMessage = (
|
|
24
31
|
<Box flexDirection="column" paddingTop={1}>
|
|
25
32
|
<Text color="gray">WAVE{version ? ` v${version}` : ""}</Text>
|
|
@@ -31,9 +38,6 @@ export const MessageList = React.memo(
|
|
|
31
38
|
</Box>
|
|
32
39
|
);
|
|
33
40
|
|
|
34
|
-
// Limit messages to prevent long rendering times
|
|
35
|
-
const maxMessages = 10;
|
|
36
|
-
|
|
37
41
|
// Filter out meta messages
|
|
38
42
|
const visibleMessages = messages.filter((m) => !m.isMeta);
|
|
39
43
|
|
package/src/contexts/useChat.tsx
CHANGED
|
@@ -702,7 +702,6 @@ export const ChatProvider: React.FC<ChatProviderProps> = ({
|
|
|
702
702
|
// Listen for Ctrl+O hotkey to toggle collapse/expand state and ESC to cancel confirmation
|
|
703
703
|
useInput((input, key) => {
|
|
704
704
|
if (key.ctrl && input === "o") {
|
|
705
|
-
// Clear terminal screen when expanded state changes
|
|
706
705
|
// Use ref to get the current value to avoid stale closure
|
|
707
706
|
const nextExpanded = !isExpandedRef.current;
|
|
708
707
|
setIsExpanded(nextExpanded);
|
|
@@ -720,8 +719,12 @@ export const ChatProvider: React.FC<ChatProviderProps> = ({
|
|
|
720
719
|
setLatestTotalTokens(extractLatestTotalTokens(msgs));
|
|
721
720
|
}
|
|
722
721
|
}
|
|
723
|
-
// Force remount to
|
|
724
|
-
requestRemount
|
|
722
|
+
// Force remount directly (bypass throttle) to ensure Static items re-render
|
|
723
|
+
// The throttled requestRemount can be dropped if pressed too quickly after
|
|
724
|
+
// a previous remount, leaving the UI stuck without a visual update
|
|
725
|
+
stdout?.write("\u001b[2J\u001b[3J\u001b[0;0H", () => {
|
|
726
|
+
setRemountKey((prev) => prev + 1);
|
|
727
|
+
});
|
|
725
728
|
}
|
|
726
729
|
|
|
727
730
|
if (key.ctrl && input === "t") {
|
package/src/utils/worktree.ts
CHANGED
|
@@ -88,6 +88,56 @@ export function createWorktree(name: string, cwd: string): WorktreeSession {
|
|
|
88
88
|
);
|
|
89
89
|
}
|
|
90
90
|
}
|
|
91
|
+
if (
|
|
92
|
+
stderr.includes("not a valid object name") ||
|
|
93
|
+
stderr.includes("unknown revision")
|
|
94
|
+
) {
|
|
95
|
+
// Base branch not fetched yet — try fetching then retrying
|
|
96
|
+
const branchNameOnly = baseBranch.split("/").pop()!;
|
|
97
|
+
try {
|
|
98
|
+
execSync(`git fetch origin ${branchNameOnly}`, {
|
|
99
|
+
cwd: repoRoot,
|
|
100
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
101
|
+
});
|
|
102
|
+
execSync(
|
|
103
|
+
`git worktree add -b ${branchName} "${worktreePath}" ${baseBranch}`,
|
|
104
|
+
{
|
|
105
|
+
cwd: repoRoot,
|
|
106
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
107
|
+
},
|
|
108
|
+
);
|
|
109
|
+
return {
|
|
110
|
+
name,
|
|
111
|
+
path: worktreePath,
|
|
112
|
+
branch: branchName,
|
|
113
|
+
repoRoot,
|
|
114
|
+
hasUncommittedChanges: false,
|
|
115
|
+
hasNewCommits: false,
|
|
116
|
+
isNew: true,
|
|
117
|
+
};
|
|
118
|
+
} catch {
|
|
119
|
+
// Fetch or retry failed — fall back to HEAD
|
|
120
|
+
try {
|
|
121
|
+
execSync(`git worktree add -b ${branchName} "${worktreePath}" HEAD`, {
|
|
122
|
+
cwd: repoRoot,
|
|
123
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
124
|
+
});
|
|
125
|
+
return {
|
|
126
|
+
name,
|
|
127
|
+
path: worktreePath,
|
|
128
|
+
branch: branchName,
|
|
129
|
+
repoRoot,
|
|
130
|
+
hasUncommittedChanges: false,
|
|
131
|
+
hasNewCommits: false,
|
|
132
|
+
isNew: true,
|
|
133
|
+
};
|
|
134
|
+
} catch {
|
|
135
|
+
throw new Error(
|
|
136
|
+
`Failed to create worktree: ${(error as Error).message}\n${stderr}`,
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
91
141
|
throw new Error(
|
|
92
142
|
`Failed to create worktree: ${(error as Error).message}\n${stderr}`,
|
|
93
143
|
);
|