wave-code 0.17.0 → 0.17.2
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.d.ts +1 -0
- package/dist/acp/agent.d.ts.map +1 -1
- package/dist/acp/agent.js +116 -1
- package/dist/components/ChatInterface.d.ts.map +1 -1
- package/dist/components/ChatInterface.js +5 -2
- package/dist/components/InputBox.d.ts +2 -0
- package/dist/components/InputBox.d.ts.map +1 -1
- package/dist/components/InputBox.js +29 -8
- package/dist/components/LoadingIndicator.d.ts +2 -1
- package/dist/components/LoadingIndicator.d.ts.map +1 -1
- package/dist/components/LoadingIndicator.js +2 -2
- package/dist/components/QueuedMessageList.d.ts.map +1 -1
- package/dist/components/QueuedMessageList.js +10 -10
- package/dist/components/StatusLine.d.ts +2 -0
- package/dist/components/StatusLine.d.ts.map +1 -1
- package/dist/components/StatusLine.js +6 -6
- package/dist/components/TaskList.d.ts +3 -0
- package/dist/components/TaskList.d.ts.map +1 -1
- package/dist/components/TaskList.js +171 -28
- package/dist/components/TaskNotificationMessage.d.ts.map +1 -1
- package/dist/components/TaskNotificationMessage.js +1 -0
- package/dist/components/WorkflowManager.d.ts +6 -0
- package/dist/components/WorkflowManager.d.ts.map +1 -0
- package/dist/components/WorkflowManager.js +102 -0
- package/dist/constants/commands.d.ts.map +1 -1
- package/dist/constants/commands.js +6 -0
- package/dist/contexts/useChat.d.ts +8 -1
- package/dist/contexts/useChat.d.ts.map +1 -1
- package/dist/contexts/useChat.js +68 -4
- package/dist/hooks/useInputManager.d.ts +2 -0
- package/dist/hooks/useInputManager.d.ts.map +1 -1
- package/dist/hooks/useInputManager.js +22 -13
- package/dist/managers/inputHandlers.d.ts.map +1 -1
- package/dist/managers/inputHandlers.js +6 -3
- package/dist/managers/inputReducer.d.ts +10 -0
- package/dist/managers/inputReducer.d.ts.map +1 -1
- package/dist/managers/inputReducer.js +41 -4
- package/dist/print-cli.d.ts.map +1 -1
- package/dist/print-cli.js +3 -31
- package/dist/reducers/workflowManagerReducer.d.ts +41 -0
- package/dist/reducers/workflowManagerReducer.d.ts.map +1 -0
- package/dist/reducers/workflowManagerReducer.js +100 -0
- package/package.json +2 -2
- package/src/acp/agent.ts +137 -1
- package/src/components/ChatInterface.tsx +10 -1
- package/src/components/InputBox.tsx +43 -3
- package/src/components/LoadingIndicator.tsx +4 -1
- package/src/components/QueuedMessageList.tsx +7 -3
- package/src/components/StatusLine.tsx +28 -16
- package/src/components/TaskList.tsx +213 -19
- package/src/components/TaskNotificationMessage.tsx +1 -0
- package/src/components/WorkflowManager.tsx +320 -0
- package/src/constants/commands.ts +6 -0
- package/src/contexts/useChat.tsx +83 -4
- package/src/hooks/useInputManager.ts +25 -13
- package/src/managers/inputHandlers.ts +5 -4
- package/src/managers/inputReducer.ts +54 -6
- package/src/print-cli.ts +3 -37
- package/src/reducers/workflowManagerReducer.ts +143 -0
|
@@ -4,16 +4,7 @@ import { searchFiles as searchFilesUtil, PromptHistoryManager, } from "wave-agen
|
|
|
4
4
|
import * as handlers from "../managers/inputHandlers.js";
|
|
5
5
|
export const useInputManager = (callbacks = {}) => {
|
|
6
6
|
const [state, dispatch] = useReducer(inputReducer, initialState);
|
|
7
|
-
const { onInputTextChange, onCursorPositionChange, onFileSelectorStateChange, onCommandSelectorStateChange, onHistorySearchStateChange, onBackgroundTaskManagerStateChange, onMcpManagerStateChange, onRewindManagerStateChange, onHelpStateChange, onStatusCommandStateChange, onPluginManagerStateChange, onModelSelectorStateChange, onImagesStateChange, onSendMessage, onHasSlashCommand, onAbortMessage, onBackgroundCurrentTask, onPermissionModeChange, onAskBtw, sessionId, workdir, getFullMessageThread, logger, } = callbacks;
|
|
8
|
-
// Handle selectorJustUsed reset
|
|
9
|
-
useEffect(() => {
|
|
10
|
-
if (state.selectorJustUsed) {
|
|
11
|
-
const timer = setTimeout(() => {
|
|
12
|
-
dispatch({ type: "SET_SELECTOR_JUST_USED", payload: false });
|
|
13
|
-
}, 0);
|
|
14
|
-
return () => clearTimeout(timer);
|
|
15
|
-
}
|
|
16
|
-
}, [state.selectorJustUsed]);
|
|
7
|
+
const { onInputTextChange, onCursorPositionChange, onFileSelectorStateChange, onCommandSelectorStateChange, onHistorySearchStateChange, onBackgroundTaskManagerStateChange, onMcpManagerStateChange, onRewindManagerStateChange, onHelpStateChange, onStatusCommandStateChange, onPluginManagerStateChange, onModelSelectorStateChange, onWorkflowManagerStateChange, onImagesStateChange, onSendMessage, onHasSlashCommand, onAbortMessage, onBackgroundCurrentTask, onPermissionModeChange, onAskBtw, sessionId, workdir, getFullMessageThread, logger, hasQueuedMessages: hasQueuedMessagesProp, onRecallQueuedMessage, } = callbacks;
|
|
17
8
|
// Handle debounced file search
|
|
18
9
|
useEffect(() => {
|
|
19
10
|
if (state.showFileSelector) {
|
|
@@ -171,6 +162,9 @@ export const useInputManager = (callbacks = {}) => {
|
|
|
171
162
|
else if (command === "model") {
|
|
172
163
|
dispatch({ type: "SET_SHOW_MODEL_SELECTOR", payload: true });
|
|
173
164
|
}
|
|
165
|
+
else if (command === "workflows") {
|
|
166
|
+
dispatch({ type: "SET_SHOW_WORKFLOW_MANAGER", payload: true });
|
|
167
|
+
}
|
|
174
168
|
else if (command === "btw") {
|
|
175
169
|
dispatch({
|
|
176
170
|
type: "SET_BTW_STATE",
|
|
@@ -179,6 +173,9 @@ export const useInputManager = (callbacks = {}) => {
|
|
|
179
173
|
}
|
|
180
174
|
}
|
|
181
175
|
break;
|
|
176
|
+
case "RECALL_QUEUED_MESSAGE":
|
|
177
|
+
onRecallQueuedMessage?.();
|
|
178
|
+
break;
|
|
182
179
|
}
|
|
183
180
|
}
|
|
184
181
|
catch (error) {
|
|
@@ -198,6 +195,7 @@ export const useInputManager = (callbacks = {}) => {
|
|
|
198
195
|
getFullMessageThread,
|
|
199
196
|
logger,
|
|
200
197
|
onHasSlashCommand,
|
|
198
|
+
onRecallQueuedMessage,
|
|
201
199
|
]);
|
|
202
200
|
useEffect(() => {
|
|
203
201
|
onFileSelectorStateChange?.(state.showFileSelector, state.filteredFiles, state.fileSearchQuery, state.atPosition);
|
|
@@ -244,6 +242,9 @@ export const useInputManager = (callbacks = {}) => {
|
|
|
244
242
|
useEffect(() => {
|
|
245
243
|
onModelSelectorStateChange?.(state.showModelSelector);
|
|
246
244
|
}, [state.showModelSelector, onModelSelectorStateChange]);
|
|
245
|
+
useEffect(() => {
|
|
246
|
+
onWorkflowManagerStateChange?.(state.showWorkflowManager);
|
|
247
|
+
}, [state.showWorkflowManager, onWorkflowManagerStateChange]);
|
|
247
248
|
useEffect(() => {
|
|
248
249
|
onImagesStateChange?.(state.attachedImages);
|
|
249
250
|
}, [state.attachedImages, onImagesStateChange]);
|
|
@@ -369,6 +370,9 @@ export const useInputManager = (callbacks = {}) => {
|
|
|
369
370
|
const setShowModelSelector = useCallback((show) => {
|
|
370
371
|
dispatch({ type: "SET_SHOW_MODEL_SELECTOR", payload: show });
|
|
371
372
|
}, []);
|
|
373
|
+
const setShowWorkflowManager = useCallback((show) => {
|
|
374
|
+
dispatch({ type: "SET_SHOW_WORKFLOW_MANAGER", payload: show });
|
|
375
|
+
}, []);
|
|
372
376
|
const setPermissionMode = useCallback((mode) => {
|
|
373
377
|
dispatch({ type: "SET_PERMISSION_MODE", payload: mode });
|
|
374
378
|
onPermissionModeChange?.(mode);
|
|
@@ -395,9 +399,10 @@ export const useInputManager = (callbacks = {}) => {
|
|
|
395
399
|
input,
|
|
396
400
|
key: {},
|
|
397
401
|
hasSlashCommand: (cmd) => !!onHasSlashCommand?.(cmd),
|
|
402
|
+
hasQueuedMessages: hasQueuedMessagesProp ?? false,
|
|
398
403
|
},
|
|
399
404
|
});
|
|
400
|
-
}, [onHasSlashCommand]);
|
|
405
|
+
}, [onHasSlashCommand, hasQueuedMessagesProp]);
|
|
401
406
|
const handleSubmit = useCallback(async () => {
|
|
402
407
|
dispatch({
|
|
403
408
|
type: "HANDLE_KEY",
|
|
@@ -405,9 +410,10 @@ export const useInputManager = (callbacks = {}) => {
|
|
|
405
410
|
input: "",
|
|
406
411
|
key: { return: true },
|
|
407
412
|
hasSlashCommand: (cmd) => !!onHasSlashCommand?.(cmd),
|
|
413
|
+
hasQueuedMessages: hasQueuedMessagesProp ?? false,
|
|
408
414
|
},
|
|
409
415
|
});
|
|
410
|
-
}, [onHasSlashCommand]);
|
|
416
|
+
}, [onHasSlashCommand, hasQueuedMessagesProp]);
|
|
411
417
|
const expandLongTextPlaceholders = useCallback((text) => {
|
|
412
418
|
return handlers.expandLongTextPlaceholders(text, state.longTextMap);
|
|
413
419
|
}, [state.longTextMap]);
|
|
@@ -425,10 +431,11 @@ export const useInputManager = (callbacks = {}) => {
|
|
|
425
431
|
input,
|
|
426
432
|
key,
|
|
427
433
|
hasSlashCommand: (cmd) => !!onHasSlashCommand?.(cmd),
|
|
434
|
+
hasQueuedMessages: hasQueuedMessagesProp ?? false,
|
|
428
435
|
},
|
|
429
436
|
});
|
|
430
437
|
return true;
|
|
431
|
-
}, [onHasSlashCommand]);
|
|
438
|
+
}, [onHasSlashCommand, hasQueuedMessagesProp]);
|
|
432
439
|
return {
|
|
433
440
|
// State
|
|
434
441
|
inputText: state.inputText,
|
|
@@ -451,6 +458,7 @@ export const useInputManager = (callbacks = {}) => {
|
|
|
451
458
|
showLoginCommand: state.showLoginCommand,
|
|
452
459
|
showPluginManager: state.showPluginManager,
|
|
453
460
|
showModelSelector: state.showModelSelector,
|
|
461
|
+
showWorkflowManager: state.showWorkflowManager,
|
|
454
462
|
permissionMode: state.permissionMode,
|
|
455
463
|
attachedImages: state.attachedImages,
|
|
456
464
|
btwState: state.btwState,
|
|
@@ -488,6 +496,7 @@ export const useInputManager = (callbacks = {}) => {
|
|
|
488
496
|
setShowLoginCommand,
|
|
489
497
|
setShowPluginManager,
|
|
490
498
|
setShowModelSelector,
|
|
499
|
+
setShowWorkflowManager,
|
|
491
500
|
setPermissionMode,
|
|
492
501
|
setBtwState,
|
|
493
502
|
// Image management
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inputHandlers.d.ts","sourceRoot":"","sources":["../../src/managers/inputHandlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,OAAO,EAAwB,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEtE,OAAO,EACL,UAAU,EACV,WAAW,EACX,qBAAqB,EACtB,MAAM,mBAAmB,CAAC;AAE3B,eAAO,MAAM,0BAA0B,GACrC,MAAM,MAAM,EACZ,aAAa,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAClC,MAcF,CAAC;AAEF,eAAO,MAAM,YAAY,GACvB,OAAO,UAAU,EACjB,UAAU,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EACrC,WAAW,OAAO,CAAC,qBAAqB,CAAC,EACzC,yBAAyB,KAAK,CAAC;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC,KACD,OAAO,CAAC,IAAI,CA8Dd,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC3B,UAAU,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,KACpC,OAAO,CAAC,OAAO,CAiBjB,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAC9B,aAAa,cAAc,EAC3B,UAAU,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EACrC,WAAW,OAAO,CAAC,qBAAqB,CAAC,SAmB1C,CAAC;AAgCF,eAAO,MAAM,qBAAqB,GAChC,MAAM,MAAM,EACZ,gBAAgB,MAAM,KACrB,MAaF,CAAC;AAEF,eAAO,MAAM,wBAAwB,GACnC,MAAM,MAAM,EACZ,gBAAgB,MAAM,KACrB,MAaF,CAAC;AAEF,eAAO,MAAM,qCAAqC,GAChD,OAAO,UAAU,EACjB,UAAU,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EACrC,WAAW,MAAM,EACjB,gBAAgB,MAAM,KACrB,IAYF,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,OAAO,UAAU,EACjB,UAAU,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EACrC,MAAM,MAAM,KACX,IAkDF,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC3B,OAAO,UAAU,EACjB,UAAU,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EACrC,WAAW,OAAO,CAAC,qBAAqB,CAAC,EACzC,OAAO,MAAM,KACZ,IAwBF,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,EAAE,UAAU,MAAM,KAAG,MAM3D,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAC9B,OAAO,UAAU,EACjB,UAAU,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EACrC,WAAW,OAAO,CAAC,qBAAqB,CAAC,EACzC,SAAS,MAAM;;;
|
|
1
|
+
{"version":3,"file":"inputHandlers.d.ts","sourceRoot":"","sources":["../../src/managers/inputHandlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -270,6 +270,9 @@ export const handleCommandSelect = (state, dispatch, callbacks, command) => {
|
|
|
270
270
|
else if (command === "model") {
|
|
271
271
|
dispatch({ type: "SET_SHOW_MODEL_SELECTOR", payload: true });
|
|
272
272
|
}
|
|
273
|
+
else if (command === "workflows") {
|
|
274
|
+
dispatch({ type: "SET_SHOW_WORKFLOW_MANAGER", payload: true });
|
|
275
|
+
}
|
|
273
276
|
else if (command === "btw") {
|
|
274
277
|
dispatch({
|
|
275
278
|
type: "SET_BTW_STATE",
|
|
@@ -504,9 +507,6 @@ export const handleNormalInput = async (state, dispatch, callbacks, input, key,
|
|
|
504
507
|
return false;
|
|
505
508
|
};
|
|
506
509
|
export const handleInput = async (state, dispatch, callbacks, input, key, clearImages) => {
|
|
507
|
-
if (state.selectorJustUsed) {
|
|
508
|
-
return true;
|
|
509
|
-
}
|
|
510
510
|
if (state.btwState.isActive) {
|
|
511
511
|
if (key.escape) {
|
|
512
512
|
dispatch({
|
|
@@ -548,6 +548,7 @@ export const handleInput = async (state, dispatch, callbacks, input, key, clearI
|
|
|
548
548
|
state.showStatusCommand ||
|
|
549
549
|
state.showPluginManager ||
|
|
550
550
|
state.showModelSelector ||
|
|
551
|
+
state.showWorkflowManager ||
|
|
551
552
|
state.btwState.isActive)) {
|
|
552
553
|
callbacks.onAbortMessage?.();
|
|
553
554
|
return true;
|
|
@@ -567,6 +568,7 @@ export const handleInput = async (state, dispatch, callbacks, input, key, clearI
|
|
|
567
568
|
state.showStatusCommand ||
|
|
568
569
|
state.showPluginManager ||
|
|
569
570
|
state.showModelSelector ||
|
|
571
|
+
state.showWorkflowManager ||
|
|
570
572
|
state.btwState.isActive) {
|
|
571
573
|
if (state.showBackgroundTaskManager ||
|
|
572
574
|
state.showMcpManager ||
|
|
@@ -575,6 +577,7 @@ export const handleInput = async (state, dispatch, callbacks, input, key, clearI
|
|
|
575
577
|
state.showStatusCommand ||
|
|
576
578
|
state.showPluginManager ||
|
|
577
579
|
state.showModelSelector ||
|
|
580
|
+
state.showWorkflowManager ||
|
|
578
581
|
state.btwState.isActive) {
|
|
579
582
|
return true;
|
|
580
583
|
}
|
|
@@ -36,6 +36,8 @@ export type PendingEffect = {
|
|
|
36
36
|
} | {
|
|
37
37
|
type: "EXECUTE_COMMAND";
|
|
38
38
|
command: string;
|
|
39
|
+
} | {
|
|
40
|
+
type: "RECALL_QUEUED_MESSAGE";
|
|
39
41
|
};
|
|
40
42
|
export interface InputManagerCallbacks {
|
|
41
43
|
onInputTextChange?: (text: string) => void;
|
|
@@ -50,6 +52,7 @@ export interface InputManagerCallbacks {
|
|
|
50
52
|
onStatusCommandStateChange?: (show: boolean) => void;
|
|
51
53
|
onPluginManagerStateChange?: (show: boolean) => void;
|
|
52
54
|
onModelSelectorStateChange?: (show: boolean) => void;
|
|
55
|
+
onWorkflowManagerStateChange?: (show: boolean) => void;
|
|
53
56
|
onImagesStateChange?: (images: AttachedImage[]) => void;
|
|
54
57
|
onSendMessage?: (content: string, images?: Array<{
|
|
55
58
|
path: string;
|
|
@@ -67,6 +70,8 @@ export interface InputManagerCallbacks {
|
|
|
67
70
|
sessionIds: string[];
|
|
68
71
|
}>;
|
|
69
72
|
logger?: Logger;
|
|
73
|
+
hasQueuedMessages?: boolean;
|
|
74
|
+
onRecallQueuedMessage?: () => void;
|
|
70
75
|
}
|
|
71
76
|
export interface InputState {
|
|
72
77
|
inputText: string;
|
|
@@ -92,6 +97,7 @@ export interface InputState {
|
|
|
92
97
|
showLoginCommand: boolean;
|
|
93
98
|
showPluginManager: boolean;
|
|
94
99
|
showModelSelector: boolean;
|
|
100
|
+
showWorkflowManager: boolean;
|
|
95
101
|
permissionMode: PermissionMode;
|
|
96
102
|
selectorJustUsed: boolean;
|
|
97
103
|
isPasting: boolean;
|
|
@@ -181,6 +187,9 @@ export type InputAction = {
|
|
|
181
187
|
} | {
|
|
182
188
|
type: "SET_SHOW_MODEL_SELECTOR";
|
|
183
189
|
payload: boolean;
|
|
190
|
+
} | {
|
|
191
|
+
type: "SET_SHOW_WORKFLOW_MANAGER";
|
|
192
|
+
payload: boolean;
|
|
184
193
|
} | {
|
|
185
194
|
type: "SET_PERMISSION_MODE";
|
|
186
195
|
payload: PermissionMode;
|
|
@@ -248,6 +257,7 @@ export type InputAction = {
|
|
|
248
257
|
input: string;
|
|
249
258
|
key: Key;
|
|
250
259
|
hasSlashCommand: (cmd: string) => boolean;
|
|
260
|
+
hasQueuedMessages?: boolean;
|
|
251
261
|
};
|
|
252
262
|
};
|
|
253
263
|
export declare function inputReducer(state: InputState, action: InputAction): InputState;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inputReducer.d.ts","sourceRoot":"","sources":["../../src/managers/inputReducer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,cAAc,EACd,MAAM,EACN,WAAW,EACX,OAAO,EACR,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"inputReducer.d.ts","sourceRoot":"","sources":["../../src/managers/inputReducer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { getAtSelectorPosition, getSlashSelectorPosition, getWordEnd, SELECTOR_TRIGGERS, getProjectedState, } from "../utils/inputUtils.js";
|
|
2
|
+
import { AVAILABLE_COMMANDS } from "../constants/commands.js";
|
|
2
3
|
export const initialState = {
|
|
3
4
|
inputText: "",
|
|
4
5
|
cursorPosition: 0,
|
|
@@ -23,6 +24,7 @@ export const initialState = {
|
|
|
23
24
|
showLoginCommand: false,
|
|
24
25
|
showPluginManager: false,
|
|
25
26
|
showModelSelector: false,
|
|
27
|
+
showWorkflowManager: false,
|
|
26
28
|
permissionMode: "default",
|
|
27
29
|
selectorJustUsed: false,
|
|
28
30
|
isPasting: false,
|
|
@@ -214,6 +216,12 @@ export function inputReducer(state, action) {
|
|
|
214
216
|
showModelSelector: action.payload,
|
|
215
217
|
selectorJustUsed: !action.payload ? true : state.selectorJustUsed,
|
|
216
218
|
};
|
|
219
|
+
case "SET_SHOW_WORKFLOW_MANAGER":
|
|
220
|
+
return {
|
|
221
|
+
...state,
|
|
222
|
+
showWorkflowManager: action.payload,
|
|
223
|
+
selectorJustUsed: !action.payload ? true : state.selectorJustUsed,
|
|
224
|
+
};
|
|
217
225
|
case "SET_PERMISSION_MODE":
|
|
218
226
|
return { ...state, permissionMode: action.payload };
|
|
219
227
|
case "SET_SELECTOR_JUST_USED":
|
|
@@ -457,9 +465,7 @@ export function inputReducer(state, action) {
|
|
|
457
465
|
return { ...state, pendingEffect: null };
|
|
458
466
|
case "HANDLE_KEY": {
|
|
459
467
|
const { input, key } = action.payload;
|
|
460
|
-
|
|
461
|
-
return state;
|
|
462
|
-
}
|
|
468
|
+
const hasQueuedMessages = action.payload.hasQueuedMessages ?? false;
|
|
463
469
|
// 1. BTW State Handling
|
|
464
470
|
if (state.btwState.isActive) {
|
|
465
471
|
if (key.escape) {
|
|
@@ -540,7 +546,8 @@ export function inputReducer(state, action) {
|
|
|
540
546
|
state.showStatusCommand ||
|
|
541
547
|
state.showLoginCommand ||
|
|
542
548
|
state.showPluginManager ||
|
|
543
|
-
state.showModelSelector
|
|
549
|
+
state.showModelSelector ||
|
|
550
|
+
state.showWorkflowManager)) {
|
|
544
551
|
return { ...state, pendingEffect: { type: "ABORT_MESSAGE" } };
|
|
545
552
|
}
|
|
546
553
|
return state;
|
|
@@ -582,6 +589,13 @@ export function inputReducer(state, action) {
|
|
|
582
589
|
if (key.upArrow &&
|
|
583
590
|
!state.showFileSelector &&
|
|
584
591
|
!state.showCommandSelector) {
|
|
592
|
+
// If queue has messages, recall from queue first (before history)
|
|
593
|
+
if (hasQueuedMessages) {
|
|
594
|
+
return {
|
|
595
|
+
...state,
|
|
596
|
+
pendingEffect: { type: "RECALL_QUEUED_MESSAGE" },
|
|
597
|
+
};
|
|
598
|
+
}
|
|
585
599
|
if (state.history.length === 0) {
|
|
586
600
|
return { ...state, pendingEffect: { type: "FETCH_HISTORY" } };
|
|
587
601
|
}
|
|
@@ -754,6 +768,29 @@ export function inputReducer(state, action) {
|
|
|
754
768
|
pendingEffect: question ? { type: "ASK_BTW", question } : null,
|
|
755
769
|
};
|
|
756
770
|
}
|
|
771
|
+
// Check if the content is a CLI-internal slash command (help, tasks,
|
|
772
|
+
// etc.) that should be executed locally rather than sent as a message.
|
|
773
|
+
// Agent slash commands and unknown /commands always go to SEND_MESSAGE.
|
|
774
|
+
if (contentWithPlaceholders.startsWith("/")) {
|
|
775
|
+
const spaceIndex = contentWithPlaceholders.indexOf(" ");
|
|
776
|
+
const commandName = spaceIndex === -1
|
|
777
|
+
? contentWithPlaceholders.substring(1)
|
|
778
|
+
: contentWithPlaceholders.substring(1, spaceIndex);
|
|
779
|
+
const isInternalCommand = AVAILABLE_COMMANDS.some((cmd) => cmd.id === commandName);
|
|
780
|
+
if (isInternalCommand) {
|
|
781
|
+
return {
|
|
782
|
+
...state,
|
|
783
|
+
inputText: "",
|
|
784
|
+
cursorPosition: 0,
|
|
785
|
+
historyIndex: -1,
|
|
786
|
+
longTextMap: {},
|
|
787
|
+
pendingEffect: {
|
|
788
|
+
type: "EXECUTE_COMMAND",
|
|
789
|
+
command: commandName,
|
|
790
|
+
},
|
|
791
|
+
};
|
|
792
|
+
}
|
|
793
|
+
}
|
|
757
794
|
return {
|
|
758
795
|
...state,
|
|
759
796
|
inputText: "",
|
package/dist/print-cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"print-cli.d.ts","sourceRoot":"","sources":["../src/print-cli.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,WAAW,eAAgB,SAAQ,YAAY;IACnD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,gBAAgB,EAAE,eAAe,CAAC,CAAC;CACvE;AAgBD,wBAAsB,aAAa,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"print-cli.d.ts","sourceRoot":"","sources":["../src/print-cli.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,WAAW,eAAgB,SAAQ,YAAY;IACnD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,gBAAgB,EAAE,eAAe,CAAC,CAAC;CACvE;AAgBD,wBAAsB,aAAa,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAqL3E"}
|
package/dist/print-cli.js
CHANGED
|
@@ -24,14 +24,14 @@ export async function startPrintCli(options) {
|
|
|
24
24
|
let agent;
|
|
25
25
|
let isReasoning = false;
|
|
26
26
|
let isContent = false;
|
|
27
|
-
const subagentReasoningStates = new Map();
|
|
28
|
-
const subagentContentStates = new Map();
|
|
29
27
|
// Setup callbacks for agent
|
|
28
|
+
// Print mode only outputs the main agent's response (matching Claude Code's
|
|
29
|
+
// behavior). Subagent output is internal — the main agent incorporates
|
|
30
|
+
// relevant results in its own response.
|
|
30
31
|
const callbacks = {
|
|
31
32
|
onAssistantMessageAdded: () => {
|
|
32
33
|
isReasoning = false;
|
|
33
34
|
isContent = false;
|
|
34
|
-
// Assistant message started - no content to output yet
|
|
35
35
|
},
|
|
36
36
|
onAssistantReasoningUpdated: (chunk) => {
|
|
37
37
|
if (!isReasoning) {
|
|
@@ -50,36 +50,8 @@ export async function startPrintCli(options) {
|
|
|
50
50
|
}
|
|
51
51
|
isContent = true;
|
|
52
52
|
}
|
|
53
|
-
// FR-001: Stream content updates for real-time display - output only the new chunk
|
|
54
53
|
process.stdout.write(chunk);
|
|
55
54
|
},
|
|
56
|
-
// Subagent message callbacks
|
|
57
|
-
onSubagentAssistantMessageAdded: (subagentId) => {
|
|
58
|
-
subagentReasoningStates.set(subagentId, false);
|
|
59
|
-
subagentContentStates.set(subagentId, false);
|
|
60
|
-
},
|
|
61
|
-
onSubagentAssistantReasoningUpdated: (subagentId, chunk) => {
|
|
62
|
-
if (!subagentReasoningStates.get(subagentId)) {
|
|
63
|
-
process.stdout.write("\n 💭 Reasoning: ");
|
|
64
|
-
subagentReasoningStates.set(subagentId, true);
|
|
65
|
-
}
|
|
66
|
-
process.stdout.write(chunk);
|
|
67
|
-
},
|
|
68
|
-
onSubagentAssistantContentUpdated: (subagentId, chunk) => {
|
|
69
|
-
if (!subagentContentStates.get(subagentId)) {
|
|
70
|
-
if (subagentReasoningStates.get(subagentId)) {
|
|
71
|
-
process.stdout.write("\n 📝 Response: ");
|
|
72
|
-
}
|
|
73
|
-
else {
|
|
74
|
-
process.stdout.write("\n ");
|
|
75
|
-
}
|
|
76
|
-
subagentContentStates.set(subagentId, true);
|
|
77
|
-
}
|
|
78
|
-
process.stdout.write(chunk);
|
|
79
|
-
},
|
|
80
|
-
onSubagentUserMessageAdded: (_subagentId, params) => {
|
|
81
|
-
process.stdout.write(`\n 👤 User: ${params.content}\n`);
|
|
82
|
-
},
|
|
83
55
|
// Tool block callback - display tool name when tool starts
|
|
84
56
|
onToolBlockUpdated: (params) => {
|
|
85
57
|
// Print tool name only during 'running' stage (happens once per tool call)
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Key } from "ink";
|
|
2
|
+
import type { WorkflowRun } from "wave-agent-sdk";
|
|
3
|
+
export type PendingEffect = {
|
|
4
|
+
type: "CANCEL";
|
|
5
|
+
} | {
|
|
6
|
+
type: "STOP_RUN";
|
|
7
|
+
runId: string;
|
|
8
|
+
};
|
|
9
|
+
export interface WorkflowManagerState {
|
|
10
|
+
runs: WorkflowRun[];
|
|
11
|
+
selectedIndex: number;
|
|
12
|
+
viewMode: "list" | "detail";
|
|
13
|
+
detailRunId: string | null;
|
|
14
|
+
pendingEffect: PendingEffect | null;
|
|
15
|
+
}
|
|
16
|
+
export type WorkflowManagerAction = {
|
|
17
|
+
type: "SET_RUNS";
|
|
18
|
+
runs: WorkflowRun[];
|
|
19
|
+
} | {
|
|
20
|
+
type: "SELECT_INDEX";
|
|
21
|
+
index: number;
|
|
22
|
+
} | {
|
|
23
|
+
type: "MOVE_UP";
|
|
24
|
+
} | {
|
|
25
|
+
type: "MOVE_DOWN";
|
|
26
|
+
} | {
|
|
27
|
+
type: "SELECT_CURRENT";
|
|
28
|
+
} | {
|
|
29
|
+
type: "SET_VIEW_MODE";
|
|
30
|
+
mode: "list" | "detail";
|
|
31
|
+
} | {
|
|
32
|
+
type: "RESET_DETAIL";
|
|
33
|
+
} | {
|
|
34
|
+
type: "HANDLE_KEY";
|
|
35
|
+
input: string;
|
|
36
|
+
key: Key;
|
|
37
|
+
} | {
|
|
38
|
+
type: "CLEAR_PENDING_EFFECT";
|
|
39
|
+
};
|
|
40
|
+
export declare function workflowManagerReducer(state: WorkflowManagerState, action: WorkflowManagerAction): WorkflowManagerState;
|
|
41
|
+
//# sourceMappingURL=workflowManagerReducer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflowManagerReducer.d.ts","sourceRoot":"","sources":["../../src/reducers/workflowManagerReducer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAExC,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC5B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,aAAa,EAAE,aAAa,GAAG,IAAI,CAAC;CACrC;AAED,MAAM,MAAM,qBAAqB,GAC7B;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,WAAW,EAAE,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1B;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,GACxB;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,GAAG,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,sBAAsB,CAAA;CAAE,CAAC;AAErC,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,oBAAoB,EAC3B,MAAM,EAAE,qBAAqB,GAC5B,oBAAoB,CAiHtB"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
export function workflowManagerReducer(state, action) {
|
|
2
|
+
switch (action.type) {
|
|
3
|
+
case "SET_RUNS":
|
|
4
|
+
return { ...state, runs: action.runs };
|
|
5
|
+
case "SELECT_INDEX":
|
|
6
|
+
return { ...state, selectedIndex: action.index };
|
|
7
|
+
case "MOVE_UP":
|
|
8
|
+
return { ...state, selectedIndex: Math.max(0, state.selectedIndex - 1) };
|
|
9
|
+
case "MOVE_DOWN":
|
|
10
|
+
return {
|
|
11
|
+
...state,
|
|
12
|
+
selectedIndex: Math.min(state.runs.length > 0 ? state.runs.length - 1 : 0, state.selectedIndex + 1),
|
|
13
|
+
};
|
|
14
|
+
case "SELECT_CURRENT":
|
|
15
|
+
if (state.runs.length > 0 && state.selectedIndex < state.runs.length) {
|
|
16
|
+
return {
|
|
17
|
+
...state,
|
|
18
|
+
detailRunId: state.runs[state.selectedIndex].runId,
|
|
19
|
+
viewMode: "detail",
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
return state;
|
|
23
|
+
case "SET_VIEW_MODE":
|
|
24
|
+
return { ...state, viewMode: action.mode };
|
|
25
|
+
case "RESET_DETAIL":
|
|
26
|
+
return {
|
|
27
|
+
...state,
|
|
28
|
+
viewMode: "list",
|
|
29
|
+
detailRunId: null,
|
|
30
|
+
};
|
|
31
|
+
case "HANDLE_KEY": {
|
|
32
|
+
const { input, key } = action;
|
|
33
|
+
if (state.viewMode === "list") {
|
|
34
|
+
if (key.return) {
|
|
35
|
+
if (state.runs.length > 0 &&
|
|
36
|
+
state.selectedIndex < state.runs.length) {
|
|
37
|
+
return {
|
|
38
|
+
...state,
|
|
39
|
+
detailRunId: state.runs[state.selectedIndex].runId,
|
|
40
|
+
viewMode: "detail",
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
return state;
|
|
44
|
+
}
|
|
45
|
+
if (key.escape) {
|
|
46
|
+
return { ...state, pendingEffect: { type: "CANCEL" } };
|
|
47
|
+
}
|
|
48
|
+
if (key.upArrow) {
|
|
49
|
+
return {
|
|
50
|
+
...state,
|
|
51
|
+
selectedIndex: Math.max(0, state.selectedIndex - 1),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
if (key.downArrow) {
|
|
55
|
+
return {
|
|
56
|
+
...state,
|
|
57
|
+
selectedIndex: Math.min(state.runs.length > 0 ? state.runs.length - 1 : 0, state.selectedIndex + 1),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
if (input === "k") {
|
|
61
|
+
if (state.runs.length > 0 &&
|
|
62
|
+
state.selectedIndex < state.runs.length) {
|
|
63
|
+
const selectedRun = state.runs[state.selectedIndex];
|
|
64
|
+
if (selectedRun.status === "running") {
|
|
65
|
+
return {
|
|
66
|
+
...state,
|
|
67
|
+
pendingEffect: { type: "STOP_RUN", runId: selectedRun.runId },
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return state;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
else if (state.viewMode === "detail") {
|
|
75
|
+
if (key.escape) {
|
|
76
|
+
return {
|
|
77
|
+
...state,
|
|
78
|
+
viewMode: "list",
|
|
79
|
+
detailRunId: null,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
if (input === "k" && state.detailRunId) {
|
|
83
|
+
const run = state.runs.find((r) => r.runId === state.detailRunId);
|
|
84
|
+
if (run && run.status === "running") {
|
|
85
|
+
return {
|
|
86
|
+
...state,
|
|
87
|
+
pendingEffect: { type: "STOP_RUN", runId: state.detailRunId },
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
return state;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return state;
|
|
94
|
+
}
|
|
95
|
+
case "CLEAR_PENDING_EFFECT":
|
|
96
|
+
return { ...state, pendingEffect: null };
|
|
97
|
+
default:
|
|
98
|
+
return state;
|
|
99
|
+
}
|
|
100
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "wave-code",
|
|
3
|
-
"version": "0.17.
|
|
3
|
+
"version": "0.17.2",
|
|
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.17.
|
|
45
|
+
"wave-agent-sdk": "0.17.2"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
48
|
"@types/react": "^19.1.8",
|