@dexto/tui 1.7.1 → 1.8.0
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/agent-backend.cjs +16 -2
- package/dist/agent-backend.d.ts +5 -2
- package/dist/agent-backend.d.ts.map +1 -1
- package/dist/agent-backend.js +15 -2
- package/dist/agent-backend.test.cjs +28 -2
- package/dist/agent-backend.test.js +28 -2
- package/dist/components/ApprovalPrompt.cjs +6 -5
- package/dist/components/ApprovalPrompt.d.ts +1 -1
- package/dist/components/ApprovalPrompt.d.ts.map +1 -1
- package/dist/components/ApprovalPrompt.js +6 -5
- package/dist/components/TextBufferInput.cjs +14 -1
- package/dist/components/TextBufferInput.d.ts +5 -1
- package/dist/components/TextBufferInput.d.ts.map +1 -1
- package/dist/components/TextBufferInput.js +14 -1
- package/dist/components/chat/QueuedMessagesDisplay.cjs +17 -8
- package/dist/components/chat/QueuedMessagesDisplay.d.ts +7 -1
- package/dist/components/chat/QueuedMessagesDisplay.d.ts.map +1 -1
- package/dist/components/chat/QueuedMessagesDisplay.js +16 -8
- package/dist/components/input/InputArea.cjs +4 -0
- package/dist/components/input/InputArea.d.ts +5 -1
- package/dist/components/input/InputArea.d.ts.map +1 -1
- package/dist/components/input/InputArea.js +4 -0
- package/dist/components/modes/AlternateBufferCLI.cjs +20 -1
- package/dist/components/modes/AlternateBufferCLI.d.ts.map +1 -1
- package/dist/components/modes/AlternateBufferCLI.js +21 -2
- package/dist/components/modes/StaticCLI.cjs +20 -1
- package/dist/components/modes/StaticCLI.d.ts.map +1 -1
- package/dist/components/modes/StaticCLI.js +21 -2
- package/dist/components/overlays/LoginOverlay.cjs +2 -10
- package/dist/components/overlays/LoginOverlay.d.ts.map +1 -1
- package/dist/components/overlays/LoginOverlay.js +3 -11
- package/dist/containers/InputContainer.cjs +119 -18
- package/dist/containers/InputContainer.d.ts +6 -2
- package/dist/containers/InputContainer.d.ts.map +1 -1
- package/dist/containers/InputContainer.js +119 -18
- package/dist/hooks/useAgentEvents.cjs +27 -5
- package/dist/hooks/useAgentEvents.d.ts +3 -2
- package/dist/hooks/useAgentEvents.d.ts.map +1 -1
- package/dist/hooks/useAgentEvents.js +27 -5
- package/dist/hooks/useCLIState.cjs +10 -4
- package/dist/hooks/useCLIState.d.ts +2 -0
- package/dist/hooks/useCLIState.d.ts.map +1 -1
- package/dist/hooks/useCLIState.js +10 -4
- package/dist/hooks/useInputOrchestrator.cjs +15 -14
- package/dist/hooks/useInputOrchestrator.d.ts +6 -6
- package/dist/hooks/useInputOrchestrator.d.ts.map +1 -1
- package/dist/hooks/useInputOrchestrator.js +15 -14
- package/dist/host/index.cjs +6 -6
- package/dist/host/index.d.ts +8 -17
- package/dist/host/index.d.ts.map +1 -1
- package/dist/host/index.js +5 -5
- package/dist/host/index.test.cjs +47 -0
- package/dist/host/index.test.d.ts +2 -0
- package/dist/host/index.test.d.ts.map +1 -0
- package/dist/host/index.test.js +50 -0
- package/dist/index.d.cts +10 -15
- package/dist/interactive-commands/command-parser.cjs +1 -0
- package/dist/interactive-commands/command-parser.d.ts.map +1 -1
- package/dist/interactive-commands/command-parser.js +1 -0
- package/dist/interactive-commands/commands.cjs +3 -0
- package/dist/interactive-commands/commands.d.ts.map +1 -1
- package/dist/interactive-commands/commands.js +3 -0
- package/dist/interactive-commands/commands.test.cjs +42 -0
- package/dist/interactive-commands/commands.test.js +42 -0
- package/dist/interactive-commands/prompt-commands.cjs +4 -66
- package/dist/interactive-commands/prompt-commands.d.ts +1 -2
- package/dist/interactive-commands/prompt-commands.d.ts.map +1 -1
- package/dist/interactive-commands/prompt-commands.js +4 -66
- package/dist/interactive-commands/skill-commands.cjs +73 -0
- package/dist/interactive-commands/skill-commands.d.ts +9 -0
- package/dist/interactive-commands/skill-commands.d.ts.map +1 -0
- package/dist/interactive-commands/skill-commands.js +49 -0
- package/dist/services/processStream.cjs +23 -4
- package/dist/services/processStream.d.ts +3 -1
- package/dist/services/processStream.d.ts.map +1 -1
- package/dist/services/processStream.js +23 -4
- package/dist/services/processStream.test.cjs +52 -2
- package/dist/services/processStream.test.js +52 -2
- package/dist/state/initialState.cjs +2 -1
- package/dist/state/initialState.d.ts.map +1 -1
- package/dist/state/initialState.js +2 -1
- package/dist/state/reducer.cjs +10 -5
- package/dist/state/reducer.d.ts.map +1 -1
- package/dist/state/reducer.js +10 -5
- package/dist/state/types.d.ts +2 -0
- package/dist/state/types.d.ts.map +1 -1
- package/dist/utils/messageFormatting.cjs +0 -23
- package/dist/utils/messageFormatting.d.ts +0 -13
- package/dist/utils/messageFormatting.d.ts.map +1 -1
- package/dist/utils/messageFormatting.js +0 -21
- package/dist/utils/queuedComposerContent.cjs +148 -0
- package/dist/utils/queuedComposerContent.d.ts +17 -0
- package/dist/utils/queuedComposerContent.d.ts.map +1 -0
- package/dist/utils/queuedComposerContent.js +123 -0
- package/dist/utils/queuedComposerContent.test.cjs +176 -0
- package/dist/utils/queuedComposerContent.test.d.ts +2 -0
- package/dist/utils/queuedComposerContent.test.d.ts.map +1 -0
- package/dist/utils/queuedComposerContent.test.js +175 -0
- package/package.json +4 -4
|
@@ -37,6 +37,7 @@ function useAgentEvents({
|
|
|
37
37
|
setInput,
|
|
38
38
|
setApproval,
|
|
39
39
|
setApprovalQueue,
|
|
40
|
+
setSteerMessages,
|
|
40
41
|
setQueuedMessages,
|
|
41
42
|
currentSessionId,
|
|
42
43
|
buffer
|
|
@@ -46,6 +47,17 @@ function useAgentEvents({
|
|
|
46
47
|
const controller = new AbortController();
|
|
47
48
|
const { signal } = controller;
|
|
48
49
|
(0, import_events.setMaxListeners)(25, signal);
|
|
50
|
+
const syncQueue = (sessionId, queue) => {
|
|
51
|
+
const getMessages = queue === "steer" ? agent.getSteerMessages(sessionId) : agent.getFollowUpMessages(sessionId);
|
|
52
|
+
void getMessages.then((messages) => {
|
|
53
|
+
if (queue === "steer") {
|
|
54
|
+
setSteerMessages(messages);
|
|
55
|
+
} else {
|
|
56
|
+
setQueuedMessages(messages);
|
|
57
|
+
}
|
|
58
|
+
}).catch(() => {
|
|
59
|
+
});
|
|
60
|
+
};
|
|
49
61
|
agent.on(
|
|
50
62
|
"llm:switched",
|
|
51
63
|
(payload) => {
|
|
@@ -163,6 +175,7 @@ function useAgentEvents({
|
|
|
163
175
|
setMessages([]);
|
|
164
176
|
setApproval(null);
|
|
165
177
|
setApprovalQueue([]);
|
|
178
|
+
setSteerMessages([]);
|
|
166
179
|
setQueuedMessages([]);
|
|
167
180
|
setUi((prev) => ({
|
|
168
181
|
...prev,
|
|
@@ -184,6 +197,7 @@ function useAgentEvents({
|
|
|
184
197
|
setPendingMessages([]);
|
|
185
198
|
setApproval(null);
|
|
186
199
|
setApprovalQueue([]);
|
|
200
|
+
setSteerMessages([]);
|
|
187
201
|
setQueuedMessages([]);
|
|
188
202
|
buffer.setText("");
|
|
189
203
|
setInput((prev) => ({
|
|
@@ -192,6 +206,7 @@ function useAgentEvents({
|
|
|
192
206
|
history: [],
|
|
193
207
|
historyIndex: -1,
|
|
194
208
|
draftBeforeHistory: "",
|
|
209
|
+
editingQueuedFollowUp: false,
|
|
195
210
|
images: [],
|
|
196
211
|
pastedBlocks: [],
|
|
197
212
|
pasteCounter: 0
|
|
@@ -227,6 +242,7 @@ function useAgentEvents({
|
|
|
227
242
|
() => {
|
|
228
243
|
setApproval(null);
|
|
229
244
|
setApprovalQueue([]);
|
|
245
|
+
setSteerMessages([]);
|
|
230
246
|
setQueuedMessages([]);
|
|
231
247
|
setUi((prev) => ({
|
|
232
248
|
...prev,
|
|
@@ -272,17 +288,22 @@ function useAgentEvents({
|
|
|
272
288
|
"message:queued",
|
|
273
289
|
(payload) => {
|
|
274
290
|
if (!payload.sessionId) return;
|
|
275
|
-
|
|
276
|
-
setQueuedMessages(messages);
|
|
277
|
-
}).catch(() => {
|
|
278
|
-
});
|
|
291
|
+
syncQueue(payload.sessionId, payload.queue);
|
|
279
292
|
},
|
|
280
293
|
{ signal }
|
|
281
294
|
);
|
|
282
295
|
agent.on(
|
|
283
296
|
"message:removed",
|
|
284
297
|
(payload) => {
|
|
285
|
-
|
|
298
|
+
if (!payload.sessionId) {
|
|
299
|
+
if (payload.queue === "steer") {
|
|
300
|
+
setSteerMessages((prev) => prev.filter((m) => m.id !== payload.id));
|
|
301
|
+
} else {
|
|
302
|
+
setQueuedMessages((prev) => prev.filter((m) => m.id !== payload.id));
|
|
303
|
+
}
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
syncQueue(payload.sessionId, payload.queue);
|
|
286
307
|
},
|
|
287
308
|
{ signal }
|
|
288
309
|
);
|
|
@@ -405,6 +426,7 @@ function useAgentEvents({
|
|
|
405
426
|
setInput,
|
|
406
427
|
setApproval,
|
|
407
428
|
setApprovalQueue,
|
|
429
|
+
setSteerMessages,
|
|
408
430
|
setQueuedMessages,
|
|
409
431
|
currentSessionId,
|
|
410
432
|
buffer
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* llm:error, run:complete, message:dequeued) are handled via agent.stream() iterator in processStream.
|
|
6
6
|
*
|
|
7
7
|
* This hook handles:
|
|
8
|
-
* - approval:request - Tool/command
|
|
8
|
+
* - approval:request - Tool/command approval requests
|
|
9
9
|
* - llm:switched - Model change notifications
|
|
10
10
|
* - session:reset - Conversation reset
|
|
11
11
|
* - session:created - New session creation (e.g., from /clear)
|
|
@@ -33,6 +33,7 @@ interface UseAgentEventsProps {
|
|
|
33
33
|
setInput: React.Dispatch<React.SetStateAction<InputState>>;
|
|
34
34
|
setApproval: React.Dispatch<React.SetStateAction<ApprovalRequest | null>>;
|
|
35
35
|
setApprovalQueue: React.Dispatch<React.SetStateAction<ApprovalRequest[]>>;
|
|
36
|
+
setSteerMessages: React.Dispatch<React.SetStateAction<QueuedMessage[]>>;
|
|
36
37
|
setQueuedMessages: React.Dispatch<React.SetStateAction<QueuedMessage[]>>;
|
|
37
38
|
/** Current session ID for filtering events */
|
|
38
39
|
currentSessionId: string | null;
|
|
@@ -45,6 +46,6 @@ interface UseAgentEventsProps {
|
|
|
45
46
|
*
|
|
46
47
|
* Also handles external triggers (run:invoke) from scheduler, A2A, etc.
|
|
47
48
|
*/
|
|
48
|
-
export declare function useAgentEvents({ agent, setMessages, setPendingMessages, setUi, setSession, setInput, setApproval, setApprovalQueue, setQueuedMessages, currentSessionId, buffer, }: UseAgentEventsProps): void;
|
|
49
|
+
export declare function useAgentEvents({ agent, setMessages, setPendingMessages, setUi, setSession, setInput, setApproval, setApprovalQueue, setSteerMessages, setQueuedMessages, currentSessionId, buffer, }: UseAgentEventsProps): void;
|
|
49
50
|
export {};
|
|
50
51
|
//# sourceMappingURL=useAgentEvents.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAgentEvents.d.ts","sourceRoot":"","sources":["../../src/hooks/useAgentEvents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,EAGH,KAAK,aAAa,EAErB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAEvE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,UAAU,mBAAmB;IACzB,KAAK,EAAE,eAAe,CAAC;IACvB,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC7D,kBAAkB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACpE,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;IACrD,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,CAAC;IAC/D,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC;IAC3D,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC,CAAC;IAC1E,gBAAgB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;IAC1E,iBAAiB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;IACzE,8CAA8C;IAC9C,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,iFAAiF;IACjF,MAAM,EAAE,UAAU,CAAC;CACtB;AAYD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,EAC3B,KAAK,EACL,WAAW,EACX,kBAAkB,EAClB,KAAK,EACL,UAAU,EACV,QAAQ,EACR,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,MAAM,GACT,EAAE,mBAAmB,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"useAgentEvents.d.ts","sourceRoot":"","sources":["../../src/hooks/useAgentEvents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,EAGH,KAAK,aAAa,EAErB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAEvE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,UAAU,mBAAmB;IACzB,KAAK,EAAE,eAAe,CAAC;IACvB,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC7D,kBAAkB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACpE,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;IACrD,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,CAAC;IAC/D,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC;IAC3D,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC,CAAC;IAC1E,gBAAgB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;IAC1E,gBAAgB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;IACxE,iBAAiB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;IACzE,8CAA8C;IAC9C,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,iFAAiF;IACjF,MAAM,EAAE,UAAU,CAAC;CACtB;AAYD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,EAC3B,KAAK,EACL,WAAW,EACX,kBAAkB,EAClB,KAAK,EACL,UAAU,EACV,QAAQ,EACR,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,MAAM,GACT,EAAE,mBAAmB,GAAG,IAAI,CAgiB5B"}
|
|
@@ -17,6 +17,7 @@ function useAgentEvents({
|
|
|
17
17
|
setInput,
|
|
18
18
|
setApproval,
|
|
19
19
|
setApprovalQueue,
|
|
20
|
+
setSteerMessages,
|
|
20
21
|
setQueuedMessages,
|
|
21
22
|
currentSessionId,
|
|
22
23
|
buffer
|
|
@@ -26,6 +27,17 @@ function useAgentEvents({
|
|
|
26
27
|
const controller = new AbortController();
|
|
27
28
|
const { signal } = controller;
|
|
28
29
|
setMaxListeners(25, signal);
|
|
30
|
+
const syncQueue = (sessionId, queue) => {
|
|
31
|
+
const getMessages = queue === "steer" ? agent.getSteerMessages(sessionId) : agent.getFollowUpMessages(sessionId);
|
|
32
|
+
void getMessages.then((messages) => {
|
|
33
|
+
if (queue === "steer") {
|
|
34
|
+
setSteerMessages(messages);
|
|
35
|
+
} else {
|
|
36
|
+
setQueuedMessages(messages);
|
|
37
|
+
}
|
|
38
|
+
}).catch(() => {
|
|
39
|
+
});
|
|
40
|
+
};
|
|
29
41
|
agent.on(
|
|
30
42
|
"llm:switched",
|
|
31
43
|
(payload) => {
|
|
@@ -143,6 +155,7 @@ function useAgentEvents({
|
|
|
143
155
|
setMessages([]);
|
|
144
156
|
setApproval(null);
|
|
145
157
|
setApprovalQueue([]);
|
|
158
|
+
setSteerMessages([]);
|
|
146
159
|
setQueuedMessages([]);
|
|
147
160
|
setUi((prev) => ({
|
|
148
161
|
...prev,
|
|
@@ -164,6 +177,7 @@ function useAgentEvents({
|
|
|
164
177
|
setPendingMessages([]);
|
|
165
178
|
setApproval(null);
|
|
166
179
|
setApprovalQueue([]);
|
|
180
|
+
setSteerMessages([]);
|
|
167
181
|
setQueuedMessages([]);
|
|
168
182
|
buffer.setText("");
|
|
169
183
|
setInput((prev) => ({
|
|
@@ -172,6 +186,7 @@ function useAgentEvents({
|
|
|
172
186
|
history: [],
|
|
173
187
|
historyIndex: -1,
|
|
174
188
|
draftBeforeHistory: "",
|
|
189
|
+
editingQueuedFollowUp: false,
|
|
175
190
|
images: [],
|
|
176
191
|
pastedBlocks: [],
|
|
177
192
|
pasteCounter: 0
|
|
@@ -207,6 +222,7 @@ function useAgentEvents({
|
|
|
207
222
|
() => {
|
|
208
223
|
setApproval(null);
|
|
209
224
|
setApprovalQueue([]);
|
|
225
|
+
setSteerMessages([]);
|
|
210
226
|
setQueuedMessages([]);
|
|
211
227
|
setUi((prev) => ({
|
|
212
228
|
...prev,
|
|
@@ -252,17 +268,22 @@ function useAgentEvents({
|
|
|
252
268
|
"message:queued",
|
|
253
269
|
(payload) => {
|
|
254
270
|
if (!payload.sessionId) return;
|
|
255
|
-
|
|
256
|
-
setQueuedMessages(messages);
|
|
257
|
-
}).catch(() => {
|
|
258
|
-
});
|
|
271
|
+
syncQueue(payload.sessionId, payload.queue);
|
|
259
272
|
},
|
|
260
273
|
{ signal }
|
|
261
274
|
);
|
|
262
275
|
agent.on(
|
|
263
276
|
"message:removed",
|
|
264
277
|
(payload) => {
|
|
265
|
-
|
|
278
|
+
if (!payload.sessionId) {
|
|
279
|
+
if (payload.queue === "steer") {
|
|
280
|
+
setSteerMessages((prev) => prev.filter((m) => m.id !== payload.id));
|
|
281
|
+
} else {
|
|
282
|
+
setQueuedMessages((prev) => prev.filter((m) => m.id !== payload.id));
|
|
283
|
+
}
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
syncQueue(payload.sessionId, payload.queue);
|
|
266
287
|
},
|
|
267
288
|
{ signal }
|
|
268
289
|
);
|
|
@@ -385,6 +406,7 @@ function useAgentEvents({
|
|
|
385
406
|
setInput,
|
|
386
407
|
setApproval,
|
|
387
408
|
setApprovalQueue,
|
|
409
|
+
setSteerMessages,
|
|
388
410
|
setQueuedMessages,
|
|
389
411
|
currentSessionId,
|
|
390
412
|
buffer
|
|
@@ -39,6 +39,7 @@ function useCLIState({
|
|
|
39
39
|
const [messages, setMessages] = (0, import_react.useState)([]);
|
|
40
40
|
const [pendingMessages, setPendingMessages] = (0, import_react.useState)([]);
|
|
41
41
|
const [dequeuedBuffer, setDequeuedBuffer] = (0, import_react.useState)([]);
|
|
42
|
+
const [steerMessages, setSteerMessages] = (0, import_react.useState)([]);
|
|
42
43
|
const [queuedMessages, setQueuedMessages] = (0, import_react.useState)([]);
|
|
43
44
|
const [todos, setTodos] = (0, import_react.useState)([]);
|
|
44
45
|
const [ui, setUi] = (0, import_react.useState)({
|
|
@@ -82,7 +83,8 @@ function useCLIState({
|
|
|
82
83
|
draftBeforeHistory: "",
|
|
83
84
|
images: [],
|
|
84
85
|
pastedBlocks: [],
|
|
85
|
-
pasteCounter: 0
|
|
86
|
+
pasteCounter: 0,
|
|
87
|
+
editingQueuedFollowUp: false
|
|
86
88
|
});
|
|
87
89
|
const initialConfig = agent.getCurrentLLMConfig();
|
|
88
90
|
const [session, setSession] = (0, import_react.useState)({
|
|
@@ -118,6 +120,7 @@ function useCLIState({
|
|
|
118
120
|
setInput,
|
|
119
121
|
setApproval,
|
|
120
122
|
setApprovalQueue,
|
|
123
|
+
setSteerMessages,
|
|
121
124
|
setQueuedMessages,
|
|
122
125
|
currentSessionId: session.id,
|
|
123
126
|
buffer
|
|
@@ -133,13 +136,13 @@ function useCLIState({
|
|
|
133
136
|
approval,
|
|
134
137
|
input,
|
|
135
138
|
session,
|
|
136
|
-
|
|
139
|
+
steerMessages,
|
|
137
140
|
buffer,
|
|
138
141
|
setUi,
|
|
139
142
|
setInput,
|
|
140
143
|
setMessages,
|
|
141
144
|
setPendingMessages,
|
|
142
|
-
|
|
145
|
+
setSteerMessages,
|
|
143
146
|
agent,
|
|
144
147
|
handlers: {
|
|
145
148
|
approval: approvalHandler,
|
|
@@ -168,7 +171,8 @@ function useCLIState({
|
|
|
168
171
|
setInput((prev) => ({
|
|
169
172
|
...prev,
|
|
170
173
|
history: userInputHistory,
|
|
171
|
-
historyIndex: -1
|
|
174
|
+
historyIndex: -1,
|
|
175
|
+
editingQueuedFollowUp: false
|
|
172
176
|
}));
|
|
173
177
|
} catch (error) {
|
|
174
178
|
if (cancelled) return;
|
|
@@ -195,6 +199,8 @@ function useCLIState({
|
|
|
195
199
|
setPendingMessages,
|
|
196
200
|
dequeuedBuffer,
|
|
197
201
|
setDequeuedBuffer,
|
|
202
|
+
steerMessages,
|
|
203
|
+
setSteerMessages,
|
|
198
204
|
queuedMessages,
|
|
199
205
|
setQueuedMessages,
|
|
200
206
|
todos,
|
|
@@ -28,6 +28,8 @@ export interface CLIStateReturn {
|
|
|
28
28
|
setPendingMessages: React.Dispatch<React.SetStateAction<Message[]>>;
|
|
29
29
|
dequeuedBuffer: Message[];
|
|
30
30
|
setDequeuedBuffer: React.Dispatch<React.SetStateAction<Message[]>>;
|
|
31
|
+
steerMessages: QueuedMessage[];
|
|
32
|
+
setSteerMessages: React.Dispatch<React.SetStateAction<QueuedMessage[]>>;
|
|
31
33
|
queuedMessages: QueuedMessage[];
|
|
32
34
|
setQueuedMessages: React.Dispatch<React.SetStateAction<QueuedMessage[]>>;
|
|
33
35
|
todos: TodoItem[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCLIState.d.ts","sourceRoot":"","sources":["../../src/hooks/useCLIState.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"useCLIState.d.ts","sourceRoot":"","sources":["../../src/hooks/useCLIState.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAA4D,MAAM,OAAO,CAAC;AAEjF,OAAO,EAAsC,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AACrF,OAAO,KAAK,EACR,OAAO,EACP,WAAW,EACX,OAAO,EACP,UAAU,EACV,YAAY,EACZ,QAAQ,EACX,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAGvE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEpE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAChF,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,qCAAqC,CAAC;AACrF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAG3D,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAErF,MAAM,WAAW,gBAAgB;IAC7B,KAAK,EAAE,eAAe,CAAC;IACvB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,WAAW,EAAE,WAAW,CAAC;IACzB,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,iEAAiE;IACjE,gBAAgB,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,GAAG,MAAM,KAAK,IAAI,CAAC;CACzD;AAED,MAAM,WAAW,cAAc;IAE3B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAE7D,eAAe,EAAE,OAAO,EAAE,CAAC;IAC3B,kBAAkB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAGpE,cAAc,EAAE,OAAO,EAAE,CAAC;IAC1B,iBAAiB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAEnE,aAAa,EAAE,aAAa,EAAE,CAAC;IAC/B,gBAAgB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;IAExE,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,iBAAiB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;IAEzE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC3D,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;IACrD,KAAK,EAAE,UAAU,CAAC;IAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC;IAC3D,OAAO,EAAE,YAAY,CAAC;IACtB,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,CAAC;IAC/D,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAC;IACjC,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC,CAAC;IAC1E,aAAa,EAAE,eAAe,EAAE,CAAC;IACjC,gBAAgB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;IAG1E,MAAM,EAAE,UAAU,CAAC;IAGnB,YAAY,EAAE,YAAY,CAAC;IAC3B,cAAc,EAAE,cAAc,CAAC;IAG/B,mBAAmB,EAAE,KAAK,CAAC,SAAS,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAAC;IAGpE,eAAe,EAAE,OAAO,EAAE,CAAC;IAG3B,KAAK,EAAE,eAAe,CAAC;IACvB,WAAW,EAAE,WAAW,CAAC;CAC5B;AAED,wBAAgB,WAAW,CAAC,EACxB,KAAK,EACL,gBAAgB,EAChB,WAAW,EACX,wBAAgC,EAChC,gBAAgB,EAAE,iBAAiB,GACtC,EAAE,gBAAgB,GAAG,cAAc,CAqPnC"}
|
|
@@ -16,6 +16,7 @@ function useCLIState({
|
|
|
16
16
|
const [messages, setMessages] = useState([]);
|
|
17
17
|
const [pendingMessages, setPendingMessages] = useState([]);
|
|
18
18
|
const [dequeuedBuffer, setDequeuedBuffer] = useState([]);
|
|
19
|
+
const [steerMessages, setSteerMessages] = useState([]);
|
|
19
20
|
const [queuedMessages, setQueuedMessages] = useState([]);
|
|
20
21
|
const [todos, setTodos] = useState([]);
|
|
21
22
|
const [ui, setUi] = useState({
|
|
@@ -59,7 +60,8 @@ function useCLIState({
|
|
|
59
60
|
draftBeforeHistory: "",
|
|
60
61
|
images: [],
|
|
61
62
|
pastedBlocks: [],
|
|
62
|
-
pasteCounter: 0
|
|
63
|
+
pasteCounter: 0,
|
|
64
|
+
editingQueuedFollowUp: false
|
|
63
65
|
});
|
|
64
66
|
const initialConfig = agent.getCurrentLLMConfig();
|
|
65
67
|
const [session, setSession] = useState({
|
|
@@ -95,6 +97,7 @@ function useCLIState({
|
|
|
95
97
|
setInput,
|
|
96
98
|
setApproval,
|
|
97
99
|
setApprovalQueue,
|
|
100
|
+
setSteerMessages,
|
|
98
101
|
setQueuedMessages,
|
|
99
102
|
currentSessionId: session.id,
|
|
100
103
|
buffer
|
|
@@ -110,13 +113,13 @@ function useCLIState({
|
|
|
110
113
|
approval,
|
|
111
114
|
input,
|
|
112
115
|
session,
|
|
113
|
-
|
|
116
|
+
steerMessages,
|
|
114
117
|
buffer,
|
|
115
118
|
setUi,
|
|
116
119
|
setInput,
|
|
117
120
|
setMessages,
|
|
118
121
|
setPendingMessages,
|
|
119
|
-
|
|
122
|
+
setSteerMessages,
|
|
120
123
|
agent,
|
|
121
124
|
handlers: {
|
|
122
125
|
approval: approvalHandler,
|
|
@@ -145,7 +148,8 @@ function useCLIState({
|
|
|
145
148
|
setInput((prev) => ({
|
|
146
149
|
...prev,
|
|
147
150
|
history: userInputHistory,
|
|
148
|
-
historyIndex: -1
|
|
151
|
+
historyIndex: -1,
|
|
152
|
+
editingQueuedFollowUp: false
|
|
149
153
|
}));
|
|
150
154
|
} catch (error) {
|
|
151
155
|
if (cancelled) return;
|
|
@@ -172,6 +176,8 @@ function useCLIState({
|
|
|
172
176
|
setPendingMessages,
|
|
173
177
|
dequeuedBuffer,
|
|
174
178
|
setDequeuedBuffer,
|
|
179
|
+
steerMessages,
|
|
180
|
+
setSteerMessages,
|
|
175
181
|
queuedMessages,
|
|
176
182
|
setQueuedMessages,
|
|
177
183
|
todos,
|
|
@@ -72,13 +72,13 @@ function useInputOrchestrator({
|
|
|
72
72
|
approval,
|
|
73
73
|
input,
|
|
74
74
|
session,
|
|
75
|
-
|
|
75
|
+
steerMessages,
|
|
76
76
|
buffer,
|
|
77
77
|
setUi,
|
|
78
78
|
setInput,
|
|
79
79
|
setMessages,
|
|
80
80
|
setPendingMessages,
|
|
81
|
-
|
|
81
|
+
setSteerMessages,
|
|
82
82
|
agent,
|
|
83
83
|
handlers
|
|
84
84
|
}) {
|
|
@@ -87,7 +87,7 @@ function useInputOrchestrator({
|
|
|
87
87
|
const approvalRef = (0, import_react.useRef)(approval);
|
|
88
88
|
const inputRef = (0, import_react.useRef)(input);
|
|
89
89
|
const sessionRef = (0, import_react.useRef)(session);
|
|
90
|
-
const
|
|
90
|
+
const steerMessagesRef = (0, import_react.useRef)(steerMessages);
|
|
91
91
|
const bufferRef = (0, import_react.useRef)(buffer);
|
|
92
92
|
const handlersRef = (0, import_react.useRef)(handlers);
|
|
93
93
|
(0, import_react.useEffect)(() => {
|
|
@@ -95,10 +95,10 @@ function useInputOrchestrator({
|
|
|
95
95
|
approvalRef.current = approval;
|
|
96
96
|
inputRef.current = input;
|
|
97
97
|
sessionRef.current = session;
|
|
98
|
-
|
|
98
|
+
steerMessagesRef.current = steerMessages;
|
|
99
99
|
bufferRef.current = buffer;
|
|
100
100
|
handlersRef.current = handlers;
|
|
101
|
-
}, [ui, approval, input, session,
|
|
101
|
+
}, [ui, approval, input, session, steerMessages, buffer, handlers]);
|
|
102
102
|
(0, import_react.useEffect)(() => {
|
|
103
103
|
if (!ui.exitWarningShown || !ui.exitWarningTimestamp) return;
|
|
104
104
|
const elapsed = Date.now() - ui.exitWarningTimestamp;
|
|
@@ -138,7 +138,7 @@ function useInputOrchestrator({
|
|
|
138
138
|
const currentUi = uiRef.current;
|
|
139
139
|
const currentApproval = approvalRef.current;
|
|
140
140
|
const currentSession = sessionRef.current;
|
|
141
|
-
const
|
|
141
|
+
const currentSteerMessages = steerMessagesRef.current;
|
|
142
142
|
const currentBuffer = bufferRef.current;
|
|
143
143
|
if (currentApproval !== null) {
|
|
144
144
|
return false;
|
|
@@ -167,8 +167,9 @@ function useInputOrchestrator({
|
|
|
167
167
|
if (currentSession.id) {
|
|
168
168
|
void agent.cancel(currentSession.id).catch(() => {
|
|
169
169
|
});
|
|
170
|
-
void agent.
|
|
170
|
+
void agent.clearSteerQueue(currentSession.id).catch(() => {
|
|
171
171
|
});
|
|
172
|
+
setSteerMessages([]);
|
|
172
173
|
}
|
|
173
174
|
setPendingMessages((pending) => {
|
|
174
175
|
if (pending.length > 0) {
|
|
@@ -202,8 +203,8 @@ function useInputOrchestrator({
|
|
|
202
203
|
timestamp: /* @__PURE__ */ new Date()
|
|
203
204
|
}
|
|
204
205
|
]);
|
|
205
|
-
if (
|
|
206
|
-
const coalescedText =
|
|
206
|
+
if (currentSteerMessages.length > 0) {
|
|
207
|
+
const coalescedText = currentSteerMessages.map(
|
|
207
208
|
(msg) => msg.content.filter(
|
|
208
209
|
(part) => part.type === "text"
|
|
209
210
|
).map((part) => part.text).join("\n")
|
|
@@ -212,7 +213,7 @@ function useInputOrchestrator({
|
|
|
212
213
|
currentBuffer.setText(coalescedText);
|
|
213
214
|
setInput((prev) => ({ ...prev, value: coalescedText }));
|
|
214
215
|
}
|
|
215
|
-
|
|
216
|
+
setSteerMessages([]);
|
|
216
217
|
}
|
|
217
218
|
return true;
|
|
218
219
|
}
|
|
@@ -220,7 +221,7 @@ function useInputOrchestrator({
|
|
|
220
221
|
return false;
|
|
221
222
|
}
|
|
222
223
|
return false;
|
|
223
|
-
}, [agent, setUi, setMessages, setPendingMessages,
|
|
224
|
+
}, [agent, setUi, setMessages, setPendingMessages, setSteerMessages, setInput]);
|
|
224
225
|
const handleKeypress = (0, import_react.useCallback)(
|
|
225
226
|
(rawKey) => {
|
|
226
227
|
const currentUi = uiRef.current;
|
|
@@ -431,7 +432,7 @@ function createApprovalInputHandler({
|
|
|
431
432
|
onCancel,
|
|
432
433
|
selectedOption,
|
|
433
434
|
setSelectedOption,
|
|
434
|
-
|
|
435
|
+
isCommandApproval
|
|
435
436
|
}) {
|
|
436
437
|
return (_input, key) => {
|
|
437
438
|
if (key.upArrow) {
|
|
@@ -440,13 +441,13 @@ function createApprovalInputHandler({
|
|
|
440
441
|
} else if (selectedOption === "yes-session") {
|
|
441
442
|
setSelectedOption("yes");
|
|
442
443
|
} else {
|
|
443
|
-
setSelectedOption(
|
|
444
|
+
setSelectedOption(isCommandApproval ? "yes" : "yes-session");
|
|
444
445
|
}
|
|
445
446
|
return true;
|
|
446
447
|
}
|
|
447
448
|
if (key.downArrow) {
|
|
448
449
|
if (selectedOption === "yes") {
|
|
449
|
-
setSelectedOption(
|
|
450
|
+
setSelectedOption(isCommandApproval ? "no" : "yes-session");
|
|
450
451
|
} else if (selectedOption === "yes-session") {
|
|
451
452
|
setSelectedOption("no");
|
|
452
453
|
} else {
|
|
@@ -62,15 +62,15 @@ export interface UseInputOrchestratorProps {
|
|
|
62
62
|
approval: ApprovalRequest | null;
|
|
63
63
|
input: InputState;
|
|
64
64
|
session: SessionState;
|
|
65
|
-
/**
|
|
66
|
-
|
|
65
|
+
/** Active-turn steer messages (for cancel handling) */
|
|
66
|
+
steerMessages: QueuedMessage[];
|
|
67
67
|
/** Text buffer for clearing input on first Ctrl+C */
|
|
68
68
|
buffer: TextBuffer;
|
|
69
69
|
setUi: React.Dispatch<React.SetStateAction<UIState>>;
|
|
70
70
|
setInput: React.Dispatch<React.SetStateAction<InputState>>;
|
|
71
71
|
setMessages: React.Dispatch<React.SetStateAction<Message[]>>;
|
|
72
72
|
setPendingMessages: React.Dispatch<React.SetStateAction<Message[]>>;
|
|
73
|
-
|
|
73
|
+
setSteerMessages: React.Dispatch<React.SetStateAction<QueuedMessage[]>>;
|
|
74
74
|
agent: TuiAgentBackend;
|
|
75
75
|
handlers: InputHandlers;
|
|
76
76
|
}
|
|
@@ -81,7 +81,7 @@ export interface UseInputOrchestratorProps {
|
|
|
81
81
|
* All keyboard handling is routed through this single point.
|
|
82
82
|
* Mouse events are handled separately by MouseProvider/ScrollProvider.
|
|
83
83
|
*/
|
|
84
|
-
export declare function useInputOrchestrator({ ui, approval, input, session,
|
|
84
|
+
export declare function useInputOrchestrator({ ui, approval, input, session, steerMessages, buffer, setUi, setInput, setMessages, setPendingMessages, setSteerMessages, agent, handlers, }: UseInputOrchestratorProps): void;
|
|
85
85
|
/**
|
|
86
86
|
* Create an input handler for the approval prompt
|
|
87
87
|
*/
|
|
@@ -91,9 +91,9 @@ export interface ApprovalHandlerProps {
|
|
|
91
91
|
onCancel: () => void;
|
|
92
92
|
selectedOption: 'yes' | 'yes-session' | 'no';
|
|
93
93
|
setSelectedOption: (option: 'yes' | 'yes-session' | 'no') => void;
|
|
94
|
-
|
|
94
|
+
isCommandApproval: boolean;
|
|
95
95
|
}
|
|
96
|
-
export declare function createApprovalInputHandler({ onApprove, onDeny, onCancel, selectedOption, setSelectedOption,
|
|
96
|
+
export declare function createApprovalInputHandler({ onApprove, onDeny, onCancel, selectedOption, setSelectedOption, isCommandApproval, }: ApprovalHandlerProps): InputHandler;
|
|
97
97
|
/**
|
|
98
98
|
* Create an input handler for selector components (BaseSelector pattern)
|
|
99
99
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useInputOrchestrator.d.ts","sourceRoot":"","sources":["../../src/hooks/useInputOrchestrator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAe,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AAEtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAK3D;;;GAGG;AACH,MAAM,WAAW,GAAG;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,GAAG,EAAE,OAAO,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,uEAAuE;IACvE,KAAK,EAAE,OAAO,CAAC;CAClB;AAyCD;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,GAAG,IAAI,CAAC;AAEvE;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC1B,qDAAqD;IACrD,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,yDAAyD;IACzD,OAAO,CAAC,EAAE,YAAY,CAAC;CAC1B;AAED,MAAM,WAAW,yBAAyB;IACtC,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAC;IACjC,KAAK,EAAE,UAAU,CAAC;IAClB,OAAO,EAAE,YAAY,CAAC;IACtB,
|
|
1
|
+
{"version":3,"file":"useInputOrchestrator.d.ts","sourceRoot":"","sources":["../../src/hooks/useInputOrchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -45,13 +45,13 @@ function useInputOrchestrator({
|
|
|
45
45
|
approval,
|
|
46
46
|
input,
|
|
47
47
|
session,
|
|
48
|
-
|
|
48
|
+
steerMessages,
|
|
49
49
|
buffer,
|
|
50
50
|
setUi,
|
|
51
51
|
setInput,
|
|
52
52
|
setMessages,
|
|
53
53
|
setPendingMessages,
|
|
54
|
-
|
|
54
|
+
setSteerMessages,
|
|
55
55
|
agent,
|
|
56
56
|
handlers
|
|
57
57
|
}) {
|
|
@@ -60,7 +60,7 @@ function useInputOrchestrator({
|
|
|
60
60
|
const approvalRef = useRef(approval);
|
|
61
61
|
const inputRef = useRef(input);
|
|
62
62
|
const sessionRef = useRef(session);
|
|
63
|
-
const
|
|
63
|
+
const steerMessagesRef = useRef(steerMessages);
|
|
64
64
|
const bufferRef = useRef(buffer);
|
|
65
65
|
const handlersRef = useRef(handlers);
|
|
66
66
|
useEffect(() => {
|
|
@@ -68,10 +68,10 @@ function useInputOrchestrator({
|
|
|
68
68
|
approvalRef.current = approval;
|
|
69
69
|
inputRef.current = input;
|
|
70
70
|
sessionRef.current = session;
|
|
71
|
-
|
|
71
|
+
steerMessagesRef.current = steerMessages;
|
|
72
72
|
bufferRef.current = buffer;
|
|
73
73
|
handlersRef.current = handlers;
|
|
74
|
-
}, [ui, approval, input, session,
|
|
74
|
+
}, [ui, approval, input, session, steerMessages, buffer, handlers]);
|
|
75
75
|
useEffect(() => {
|
|
76
76
|
if (!ui.exitWarningShown || !ui.exitWarningTimestamp) return;
|
|
77
77
|
const elapsed = Date.now() - ui.exitWarningTimestamp;
|
|
@@ -111,7 +111,7 @@ function useInputOrchestrator({
|
|
|
111
111
|
const currentUi = uiRef.current;
|
|
112
112
|
const currentApproval = approvalRef.current;
|
|
113
113
|
const currentSession = sessionRef.current;
|
|
114
|
-
const
|
|
114
|
+
const currentSteerMessages = steerMessagesRef.current;
|
|
115
115
|
const currentBuffer = bufferRef.current;
|
|
116
116
|
if (currentApproval !== null) {
|
|
117
117
|
return false;
|
|
@@ -140,8 +140,9 @@ function useInputOrchestrator({
|
|
|
140
140
|
if (currentSession.id) {
|
|
141
141
|
void agent.cancel(currentSession.id).catch(() => {
|
|
142
142
|
});
|
|
143
|
-
void agent.
|
|
143
|
+
void agent.clearSteerQueue(currentSession.id).catch(() => {
|
|
144
144
|
});
|
|
145
|
+
setSteerMessages([]);
|
|
145
146
|
}
|
|
146
147
|
setPendingMessages((pending) => {
|
|
147
148
|
if (pending.length > 0) {
|
|
@@ -175,8 +176,8 @@ function useInputOrchestrator({
|
|
|
175
176
|
timestamp: /* @__PURE__ */ new Date()
|
|
176
177
|
}
|
|
177
178
|
]);
|
|
178
|
-
if (
|
|
179
|
-
const coalescedText =
|
|
179
|
+
if (currentSteerMessages.length > 0) {
|
|
180
|
+
const coalescedText = currentSteerMessages.map(
|
|
180
181
|
(msg) => msg.content.filter(
|
|
181
182
|
(part) => part.type === "text"
|
|
182
183
|
).map((part) => part.text).join("\n")
|
|
@@ -185,7 +186,7 @@ function useInputOrchestrator({
|
|
|
185
186
|
currentBuffer.setText(coalescedText);
|
|
186
187
|
setInput((prev) => ({ ...prev, value: coalescedText }));
|
|
187
188
|
}
|
|
188
|
-
|
|
189
|
+
setSteerMessages([]);
|
|
189
190
|
}
|
|
190
191
|
return true;
|
|
191
192
|
}
|
|
@@ -193,7 +194,7 @@ function useInputOrchestrator({
|
|
|
193
194
|
return false;
|
|
194
195
|
}
|
|
195
196
|
return false;
|
|
196
|
-
}, [agent, setUi, setMessages, setPendingMessages,
|
|
197
|
+
}, [agent, setUi, setMessages, setPendingMessages, setSteerMessages, setInput]);
|
|
197
198
|
const handleKeypress = useCallback(
|
|
198
199
|
(rawKey) => {
|
|
199
200
|
const currentUi = uiRef.current;
|
|
@@ -404,7 +405,7 @@ function createApprovalInputHandler({
|
|
|
404
405
|
onCancel,
|
|
405
406
|
selectedOption,
|
|
406
407
|
setSelectedOption,
|
|
407
|
-
|
|
408
|
+
isCommandApproval
|
|
408
409
|
}) {
|
|
409
410
|
return (_input, key) => {
|
|
410
411
|
if (key.upArrow) {
|
|
@@ -413,13 +414,13 @@ function createApprovalInputHandler({
|
|
|
413
414
|
} else if (selectedOption === "yes-session") {
|
|
414
415
|
setSelectedOption("yes");
|
|
415
416
|
} else {
|
|
416
|
-
setSelectedOption(
|
|
417
|
+
setSelectedOption(isCommandApproval ? "yes" : "yes-session");
|
|
417
418
|
}
|
|
418
419
|
return true;
|
|
419
420
|
}
|
|
420
421
|
if (key.downArrow) {
|
|
421
422
|
if (selectedOption === "yes") {
|
|
422
|
-
setSelectedOption(
|
|
423
|
+
setSelectedOption(isCommandApproval ? "no" : "yes-session");
|
|
423
424
|
} else if (selectedOption === "yes-session") {
|
|
424
425
|
setSelectedOption("no");
|
|
425
426
|
} else {
|