@dexto/tui 1.13.4 → 1.14.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.
Files changed (72) hide show
  1. package/dist/agent-backend.cjs +2 -0
  2. package/dist/agent-backend.d.ts +2 -0
  3. package/dist/agent-backend.d.ts.map +1 -1
  4. package/dist/agent-backend.js +2 -0
  5. package/dist/components/ApprovalPrompt.cjs +19 -17
  6. package/dist/components/ApprovalPrompt.d.ts +2 -1
  7. package/dist/components/ApprovalPrompt.d.ts.map +1 -1
  8. package/dist/components/ApprovalPrompt.js +19 -17
  9. package/dist/components/ApprovalPrompt.test.cjs +119 -0
  10. package/dist/components/ApprovalPrompt.test.d.ts +2 -0
  11. package/dist/components/ApprovalPrompt.test.d.ts.map +1 -0
  12. package/dist/components/ApprovalPrompt.test.js +120 -0
  13. package/dist/components/Footer.cjs +5 -1
  14. package/dist/components/Footer.d.ts.map +1 -1
  15. package/dist/components/Footer.js +5 -1
  16. package/dist/components/Footer.test.cjs +47 -0
  17. package/dist/components/Footer.test.d.ts +2 -0
  18. package/dist/components/Footer.test.d.ts.map +1 -0
  19. package/dist/components/Footer.test.js +46 -0
  20. package/dist/components/modes/AlternateBufferCLI.cjs +3 -1
  21. package/dist/components/modes/AlternateBufferCLI.d.ts.map +1 -1
  22. package/dist/components/modes/AlternateBufferCLI.js +3 -1
  23. package/dist/components/modes/StaticCLI.cjs +3 -1
  24. package/dist/components/modes/StaticCLI.d.ts.map +1 -1
  25. package/dist/components/modes/StaticCLI.js +3 -1
  26. package/dist/components/overlays/PermissionsSelector.cjs +139 -0
  27. package/dist/components/overlays/PermissionsSelector.d.ts +16 -0
  28. package/dist/components/overlays/PermissionsSelector.d.ts.map +1 -0
  29. package/dist/components/overlays/PermissionsSelector.js +115 -0
  30. package/dist/components/overlays/PermissionsSelector.test.cjs +105 -0
  31. package/dist/components/overlays/PermissionsSelector.test.d.ts +2 -0
  32. package/dist/components/overlays/PermissionsSelector.test.d.ts.map +1 -0
  33. package/dist/components/overlays/PermissionsSelector.test.js +104 -0
  34. package/dist/containers/InputContainer.cjs +108 -28
  35. package/dist/containers/InputContainer.d.ts +1 -0
  36. package/dist/containers/InputContainer.d.ts.map +1 -1
  37. package/dist/containers/InputContainer.js +108 -28
  38. package/dist/containers/OverlayContainer.cjs +15 -0
  39. package/dist/containers/OverlayContainer.d.ts.map +1 -1
  40. package/dist/containers/OverlayContainer.js +17 -0
  41. package/dist/hooks/useAgentEvents.cjs +6 -3
  42. package/dist/hooks/useAgentEvents.d.ts.map +1 -1
  43. package/dist/hooks/useAgentEvents.js +6 -3
  44. package/dist/hooks/useCLIState.cjs +28 -8
  45. package/dist/hooks/useCLIState.d.ts +1 -0
  46. package/dist/hooks/useCLIState.d.ts.map +1 -1
  47. package/dist/hooks/useCLIState.js +28 -8
  48. package/dist/hooks/useCLIState.test.cjs +583 -0
  49. package/dist/hooks/useCLIState.test.d.ts +2 -0
  50. package/dist/hooks/useCLIState.test.d.ts.map +1 -0
  51. package/dist/hooks/useCLIState.test.js +582 -0
  52. package/dist/index.d.cts +2 -0
  53. package/dist/interactive-commands/commands.test.cjs +6 -0
  54. package/dist/interactive-commands/commands.test.js +6 -0
  55. package/dist/interactive-commands/tool-commands.cjs +7 -0
  56. package/dist/interactive-commands/tool-commands.d.ts.map +1 -1
  57. package/dist/interactive-commands/tool-commands.js +7 -0
  58. package/dist/services/processStream.cjs +4 -2
  59. package/dist/services/processStream.d.ts.map +1 -1
  60. package/dist/services/processStream.js +4 -2
  61. package/dist/services/processStream.test.cjs +63 -0
  62. package/dist/services/processStream.test.js +63 -0
  63. package/dist/state/types.d.ts +1 -1
  64. package/dist/state/types.d.ts.map +1 -1
  65. package/dist/utils/approvalScope.cjs +35 -0
  66. package/dist/utils/approvalScope.d.ts +3 -0
  67. package/dist/utils/approvalScope.d.ts.map +1 -0
  68. package/dist/utils/approvalScope.js +11 -0
  69. package/dist/utils/commandOverlays.cjs +1 -0
  70. package/dist/utils/commandOverlays.d.ts.map +1 -1
  71. package/dist/utils/commandOverlays.js +1 -0
  72. package/package.json +5 -5
@@ -150,20 +150,35 @@ function useCLIState({
150
150
  overlay: overlayHandler
151
151
  }
152
152
  });
153
+ const previousSessionId = (0, import_react.useRef)(session.id);
154
+ (0, import_react.useEffect)(() => {
155
+ if (previousSessionId.current !== null && previousSessionId.current !== session.id) {
156
+ setUi((previous) => ({
157
+ ...previous,
158
+ autoApproveEdits: false,
159
+ bypassPermissions: false
160
+ }));
161
+ }
162
+ previousSessionId.current = session.id;
163
+ }, [session.id]);
153
164
  (0, import_react.useEffect)(() => {
154
165
  setTodos([]);
155
166
  }, [session.id]);
167
+ const hydratedSessionId = (0, import_react.useRef)(null);
168
+ const [isHydratingHistory, setIsHydratingHistory] = (0, import_react.useState)(initialSessionId !== null);
156
169
  (0, import_react.useEffect)(() => {
157
- if (!initialSessionId || !session.hasActiveSession || messages.length > 0) {
170
+ if (!initialSessionId || session.id !== initialSessionId || !session.hasActiveSession || hydratedSessionId.current === initialSessionId) {
158
171
  return;
159
172
  }
160
173
  let cancelled = false;
174
+ setIsHydratingHistory(true);
161
175
  (async () => {
162
176
  try {
163
177
  const history = await agent.getSessionHistory(initialSessionId);
164
- if (!history?.length || cancelled) return;
178
+ if (cancelled) return;
179
+ if (!history.length) return;
165
180
  const historyMessages = (0, import_messageFormatting.convertHistoryToUIMessages)(history, initialSessionId);
166
- setMessages(historyMessages);
181
+ setMessages((previous) => [...historyMessages, ...previous]);
167
182
  const userInputHistory = history.filter(import_core.isUserMessage).map(
168
183
  (msg) => msg.content.filter(
169
184
  (part) => part.type === "text"
@@ -171,9 +186,8 @@ function useCLIState({
171
186
  ).filter((text) => text.trim().length > 0);
172
187
  setInput((prev) => ({
173
188
  ...prev,
174
- history: userInputHistory,
175
- historyIndex: -1,
176
- editingQueuedFollowUp: false
189
+ history: [...userInputHistory, ...prev.history],
190
+ historyIndex: prev.historyIndex < 0 ? prev.historyIndex : prev.historyIndex + userInputHistory.length
177
191
  }));
178
192
  } catch (error) {
179
193
  if (cancelled) return;
@@ -186,13 +200,18 @@ function useCLIState({
186
200
  timestamp: /* @__PURE__ */ new Date()
187
201
  }
188
202
  ]);
203
+ } finally {
204
+ if (!cancelled) {
205
+ hydratedSessionId.current = initialSessionId;
206
+ setIsHydratingHistory(false);
207
+ }
189
208
  }
190
209
  })();
191
210
  return () => {
192
211
  cancelled = true;
193
212
  };
194
- }, [agent, initialSessionId, messages.length, session.hasActiveSession]);
195
- const visibleMessages = messages;
213
+ }, [agent, initialSessionId, session.id, session.hasActiveSession]);
214
+ const visibleMessages = isHydratingHistory && session.id === initialSessionId ? [] : messages;
196
215
  return {
197
216
  messages,
198
217
  setMessages,
@@ -221,6 +240,7 @@ function useCLIState({
221
240
  messageService,
222
241
  overlayContainerRef,
223
242
  visibleMessages,
243
+ isHydratingHistory: isHydratingHistory && session.id === initialSessionId,
224
244
  agent,
225
245
  startupInfo
226
246
  };
@@ -49,6 +49,7 @@ export interface CLIStateReturn {
49
49
  messageService: MessageService;
50
50
  overlayContainerRef: React.RefObject<OverlayContainerHandle | null>;
51
51
  visibleMessages: Message[];
52
+ isHydratingHistory: boolean;
52
53
  agent: TuiAgentBackend;
53
54
  startupInfo: StartupInfo;
54
55
  }
@@ -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":"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"}
@@ -127,20 +127,35 @@ function useCLIState({
127
127
  overlay: overlayHandler
128
128
  }
129
129
  });
130
+ const previousSessionId = useRef(session.id);
131
+ useEffect(() => {
132
+ if (previousSessionId.current !== null && previousSessionId.current !== session.id) {
133
+ setUi((previous) => ({
134
+ ...previous,
135
+ autoApproveEdits: false,
136
+ bypassPermissions: false
137
+ }));
138
+ }
139
+ previousSessionId.current = session.id;
140
+ }, [session.id]);
130
141
  useEffect(() => {
131
142
  setTodos([]);
132
143
  }, [session.id]);
144
+ const hydratedSessionId = useRef(null);
145
+ const [isHydratingHistory, setIsHydratingHistory] = useState(initialSessionId !== null);
133
146
  useEffect(() => {
134
- if (!initialSessionId || !session.hasActiveSession || messages.length > 0) {
147
+ if (!initialSessionId || session.id !== initialSessionId || !session.hasActiveSession || hydratedSessionId.current === initialSessionId) {
135
148
  return;
136
149
  }
137
150
  let cancelled = false;
151
+ setIsHydratingHistory(true);
138
152
  (async () => {
139
153
  try {
140
154
  const history = await agent.getSessionHistory(initialSessionId);
141
- if (!history?.length || cancelled) return;
155
+ if (cancelled) return;
156
+ if (!history.length) return;
142
157
  const historyMessages = convertHistoryToUIMessages(history, initialSessionId);
143
- setMessages(historyMessages);
158
+ setMessages((previous) => [...historyMessages, ...previous]);
144
159
  const userInputHistory = history.filter(isUserMessage).map(
145
160
  (msg) => msg.content.filter(
146
161
  (part) => part.type === "text"
@@ -148,9 +163,8 @@ function useCLIState({
148
163
  ).filter((text) => text.trim().length > 0);
149
164
  setInput((prev) => ({
150
165
  ...prev,
151
- history: userInputHistory,
152
- historyIndex: -1,
153
- editingQueuedFollowUp: false
166
+ history: [...userInputHistory, ...prev.history],
167
+ historyIndex: prev.historyIndex < 0 ? prev.historyIndex : prev.historyIndex + userInputHistory.length
154
168
  }));
155
169
  } catch (error) {
156
170
  if (cancelled) return;
@@ -163,13 +177,18 @@ function useCLIState({
163
177
  timestamp: /* @__PURE__ */ new Date()
164
178
  }
165
179
  ]);
180
+ } finally {
181
+ if (!cancelled) {
182
+ hydratedSessionId.current = initialSessionId;
183
+ setIsHydratingHistory(false);
184
+ }
166
185
  }
167
186
  })();
168
187
  return () => {
169
188
  cancelled = true;
170
189
  };
171
- }, [agent, initialSessionId, messages.length, session.hasActiveSession]);
172
- const visibleMessages = messages;
190
+ }, [agent, initialSessionId, session.id, session.hasActiveSession]);
191
+ const visibleMessages = isHydratingHistory && session.id === initialSessionId ? [] : messages;
173
192
  return {
174
193
  messages,
175
194
  setMessages,
@@ -198,6 +217,7 @@ function useCLIState({
198
217
  messageService,
199
218
  overlayContainerRef,
200
219
  visibleMessages,
220
+ isHydratingHistory: isHydratingHistory && session.id === initialSessionId,
201
221
  agent,
202
222
  startupInfo
203
223
  };