codebase-cli 2.0.0-pre.34 → 2.0.0-pre.35
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/plan/run-flow.js +89 -0
- package/dist/plan/run-flow.js.map +1 -0
- package/dist/ui/App.js +13 -262
- package/dist/ui/App.js.map +1 -1
- package/dist/ui/CompactionBanner.js +23 -0
- package/dist/ui/CompactionBanner.js.map +1 -0
- package/dist/ui/shell-escape.js +42 -0
- package/dist/ui/shell-escape.js.map +1 -0
- package/dist/ui/use-coalesced-agent-events.js +70 -0
- package/dist/ui/use-coalesced-agent-events.js.map +1 -0
- package/dist/ui/use-prompt-suggestion.js +52 -0
- package/dist/ui/use-prompt-suggestion.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { UserQueryCancelled } from "../user-queries/store.js";
|
|
2
|
+
import { buildAgentPrompt, generatePlan, generateQuestion, MAX_QUESTIONS, parseAnswer, revisePlan } from "./flow.js";
|
|
3
|
+
import { ANSWER_START_BUILDING } from "./types.js";
|
|
4
|
+
/**
|
|
5
|
+
* Plan-mode flow:
|
|
6
|
+
* 1. Q&A loop (up to MAX_QUESTIONS, with the start-building escape).
|
|
7
|
+
* 2. Generate plan, render as a synthetic assistant message so the
|
|
8
|
+
* user can read it in chat.
|
|
9
|
+
* 3. Approve / Revise / Cancel via the UserQuery primitive.
|
|
10
|
+
* 4. On approve, hand the original prompt + plan + Q&A to the agent
|
|
11
|
+
* with the canonical buildAgentPrompt wrapper so weaker models
|
|
12
|
+
* stick to the plan instead of re-planning mid-execution.
|
|
13
|
+
*/
|
|
14
|
+
export async function runPlanFlow(bundle, originalPrompt, handlers) {
|
|
15
|
+
const { onReply, onError } = handlers;
|
|
16
|
+
const qaHistory = [];
|
|
17
|
+
try {
|
|
18
|
+
for (let i = 0; i < MAX_QUESTIONS; i++) {
|
|
19
|
+
const result = await generateQuestion(bundle.glue, originalPrompt, qaHistory, i);
|
|
20
|
+
if (result.done || !result.question)
|
|
21
|
+
break;
|
|
22
|
+
const q = result.question;
|
|
23
|
+
const optionLabels = q.options?.map((o) => o.label);
|
|
24
|
+
const answer = await bundle.userQueries.ask({
|
|
25
|
+
question: q.question,
|
|
26
|
+
options: optionLabels,
|
|
27
|
+
placeholder: optionLabels ? `1-${optionLabels.length}, or type a free-form answer` : undefined,
|
|
28
|
+
});
|
|
29
|
+
const resolved = parseAnswer(answer, q);
|
|
30
|
+
if (resolved === ANSWER_START_BUILDING)
|
|
31
|
+
break;
|
|
32
|
+
qaHistory.push({ question: q.question, answer: resolved });
|
|
33
|
+
}
|
|
34
|
+
let plan = await generatePlan(bundle.glue, originalPrompt, qaHistory);
|
|
35
|
+
while (true) {
|
|
36
|
+
onReply(plan);
|
|
37
|
+
const decision = await bundle.userQueries.ask({
|
|
38
|
+
question: "Approve this plan and run it?",
|
|
39
|
+
options: ["Yes — run it", "Revise", "Cancel"],
|
|
40
|
+
});
|
|
41
|
+
const choice = matchOption(decision, ["Yes — run it", "Revise", "Cancel"]);
|
|
42
|
+
if (choice === "Yes — run it") {
|
|
43
|
+
const finalPrompt = buildAgentPrompt(originalPrompt, plan, qaHistory);
|
|
44
|
+
bundle.agent.prompt(finalPrompt).catch((err) => {
|
|
45
|
+
onError(err instanceof Error ? err.message : String(err));
|
|
46
|
+
});
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (choice === "Cancel") {
|
|
50
|
+
onReply("(plan cancelled)");
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const feedback = await bundle.userQueries.ask({
|
|
54
|
+
question: "What should change about the plan?",
|
|
55
|
+
placeholder: "describe the revision",
|
|
56
|
+
});
|
|
57
|
+
plan = await revisePlan(bundle.glue, plan, feedback);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
if (err instanceof UserQueryCancelled) {
|
|
62
|
+
onReply("(plan cancelled)");
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
onError(`plan flow failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Resolve a user's typed answer to one of the supplied options.
|
|
70
|
+
* Accepts the option label (case-insensitive), a 1-based index,
|
|
71
|
+
* or the leading word of the label. Falls back to the raw input
|
|
72
|
+
* if nothing matches — caller decides what to do with that.
|
|
73
|
+
*/
|
|
74
|
+
function matchOption(answer, options) {
|
|
75
|
+
const trimmed = answer.trim();
|
|
76
|
+
const idx = Number.parseInt(trimmed, 10);
|
|
77
|
+
if (Number.isFinite(idx) && idx >= 1 && idx <= options.length) {
|
|
78
|
+
return options[idx - 1];
|
|
79
|
+
}
|
|
80
|
+
const lower = trimmed.toLowerCase();
|
|
81
|
+
for (const option of options) {
|
|
82
|
+
if (option.toLowerCase() === lower)
|
|
83
|
+
return option;
|
|
84
|
+
if (option.toLowerCase().startsWith(lower) && lower.length >= 3)
|
|
85
|
+
return option;
|
|
86
|
+
}
|
|
87
|
+
return trimmed;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=run-flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-flow.js","sourceRoot":"","sources":["../../src/plan/run-flow.ts"],"names":[],"mappings":"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"}
|
package/dist/ui/App.js
CHANGED
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { spawn } from "node:child_process";
|
|
3
2
|
import { Box, Text, useApp } from "ink";
|
|
4
|
-
import { useEffect, useMemo, useReducer,
|
|
3
|
+
import { useEffect, useMemo, useReducer, useState } from "react";
|
|
5
4
|
import { createAgent } from "../agent/agent.js";
|
|
6
5
|
import { ConfigError } from "../agent/config.js";
|
|
7
6
|
import { initialState, reducer } from "../agent/events.js";
|
|
8
|
-
import { generateSuggestion } from "../agent/prompt-suggestion.js";
|
|
9
7
|
import { routeUserInput } from "../agent/router.js";
|
|
10
8
|
import { BUILTIN_COMMANDS } from "../commands/builtins.js";
|
|
11
9
|
import { CommandRegistry } from "../commands/registry.js";
|
|
12
|
-
import {
|
|
13
|
-
import { ANSWER_START_BUILDING } from "../plan/types.js";
|
|
14
|
-
import { UserQueryCancelled } from "../user-queries/store.js";
|
|
10
|
+
import { runPlanFlow } from "../plan/run-flow.js";
|
|
15
11
|
import { buildAttachmentPrompt, collectAttachments } from "./attachments.js";
|
|
12
|
+
import { CompactionBanner } from "./CompactionBanner.js";
|
|
16
13
|
import { FirstRunSetup } from "./FirstRunSetup.js";
|
|
17
14
|
import { HistoryStore } from "./history-store.js";
|
|
18
15
|
import { Input } from "./Input.js";
|
|
19
16
|
import { MessageList } from "./MessageList.js";
|
|
20
17
|
import { Permission } from "./Permission.js";
|
|
21
18
|
import { Status } from "./Status.js";
|
|
19
|
+
import { runShellEscape } from "./shell-escape.js";
|
|
22
20
|
import { TaskPanel } from "./TaskPanel.js";
|
|
23
21
|
import { ToolPanel } from "./ToolPanel.js";
|
|
24
22
|
import { UserQueryView } from "./UserQuery.js";
|
|
23
|
+
import { useCoalescedAgentEvents } from "./use-coalesced-agent-events.js";
|
|
24
|
+
import { usePromptSuggestion } from "./use-prompt-suggestion.js";
|
|
25
25
|
import { Welcome } from "./Welcome.js";
|
|
26
26
|
export function App() {
|
|
27
27
|
const { exit } = useApp();
|
|
@@ -93,70 +93,7 @@ function ChatApp({ bundle, onExit }) {
|
|
|
93
93
|
}
|
|
94
94
|
return out;
|
|
95
95
|
}, [state.messages, persistedHistory]);
|
|
96
|
-
|
|
97
|
-
// and per-chunk tool stdout) to one React commit per frame instead of
|
|
98
|
-
// per event. Pi-agent-core emits one message_update per token, and a
|
|
99
|
-
// fast model + long tool output can fire 100+ Hz — each dispatch runs
|
|
100
|
-
// the full reducer + React tree diff + Yoga layout for everything on
|
|
101
|
-
// screen. Throttling here is the single biggest cause of perceived
|
|
102
|
-
// scroll/render jankiness; everything else (Static for finalized
|
|
103
|
-
// messages, memoized children) is icing.
|
|
104
|
-
//
|
|
105
|
-
// Keyed coalescing: message_update has one slot, tool_execution_update
|
|
106
|
-
// has one slot per tool id. Latest event wins. Non-coalesceable events
|
|
107
|
-
// (message_start/end, tool_execution_start/end, turn_*, agent_*) flush
|
|
108
|
-
// any pending updates first so ordering stays correct.
|
|
109
|
-
const pendingRef = useRef(new Map());
|
|
110
|
-
const flushTimerRef = useRef(null);
|
|
111
|
-
useEffect(() => {
|
|
112
|
-
const STREAM_FRAME_MS = 16; // ~60fps cap
|
|
113
|
-
const flush = () => {
|
|
114
|
-
flushTimerRef.current = null;
|
|
115
|
-
if (pendingRef.current.size === 0)
|
|
116
|
-
return;
|
|
117
|
-
const events = [...pendingRef.current.values()];
|
|
118
|
-
pendingRef.current.clear();
|
|
119
|
-
for (const event of events) {
|
|
120
|
-
dispatch({ type: "agent-event", event });
|
|
121
|
-
}
|
|
122
|
-
};
|
|
123
|
-
const scheduleFlush = () => {
|
|
124
|
-
if (flushTimerRef.current != null)
|
|
125
|
-
return;
|
|
126
|
-
flushTimerRef.current = setTimeout(flush, STREAM_FRAME_MS);
|
|
127
|
-
};
|
|
128
|
-
const unsubscribe = bundle.subscribe((event) => {
|
|
129
|
-
if (event.type === "message_update") {
|
|
130
|
-
pendingRef.current.set("msg", event);
|
|
131
|
-
scheduleFlush();
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
if (event.type === "tool_execution_update") {
|
|
135
|
-
pendingRef.current.set(`tool:${event.toolCallId}`, event);
|
|
136
|
-
scheduleFlush();
|
|
137
|
-
return;
|
|
138
|
-
}
|
|
139
|
-
// Any other event flushes the queue before dispatching so the
|
|
140
|
-
// reducer sees pending streaming updates before the terminal
|
|
141
|
-
// event (message_end, tool_execution_end, etc.).
|
|
142
|
-
if (pendingRef.current.size > 0) {
|
|
143
|
-
if (flushTimerRef.current != null) {
|
|
144
|
-
clearTimeout(flushTimerRef.current);
|
|
145
|
-
flushTimerRef.current = null;
|
|
146
|
-
}
|
|
147
|
-
flush();
|
|
148
|
-
}
|
|
149
|
-
dispatch({ type: "agent-event", event });
|
|
150
|
-
});
|
|
151
|
-
return () => {
|
|
152
|
-
unsubscribe();
|
|
153
|
-
if (flushTimerRef.current != null) {
|
|
154
|
-
clearTimeout(flushTimerRef.current);
|
|
155
|
-
flushTimerRef.current = null;
|
|
156
|
-
}
|
|
157
|
-
pendingRef.current.clear();
|
|
158
|
-
};
|
|
159
|
-
}, [bundle]);
|
|
96
|
+
useCoalescedAgentEvents(bundle, dispatch);
|
|
160
97
|
useEffect(() => {
|
|
161
98
|
return bundle.permissions.subscribe((req) => setPermRequest(req));
|
|
162
99
|
}, [bundle]);
|
|
@@ -170,50 +107,7 @@ function ChatApp({ bundle, onExit }) {
|
|
|
170
107
|
return bundle.toolContext.tasks.subscribe((snapshot) => setTasks(snapshot));
|
|
171
108
|
}, [bundle]);
|
|
172
109
|
const busy = state.status === "thinking" || state.status === "streaming" || state.status === "tool";
|
|
173
|
-
|
|
174
|
-
// call when the agent goes idle; cancels the prior call on every new
|
|
175
|
-
// state change so we never race two suggestions or show a stale one
|
|
176
|
-
// after the user starts a new turn. 500ms debounce lets idle settle
|
|
177
|
-
// (e.g. agent finishes, a quick status emit follows, we don't want to
|
|
178
|
-
// fire twice). Disabled via env so users on metered BYOK providers
|
|
179
|
-
// can opt out.
|
|
180
|
-
const [suggestion, setSuggestion] = useState(null);
|
|
181
|
-
const suggestionAbortRef = useRef(null);
|
|
182
|
-
useEffect(() => {
|
|
183
|
-
// Always clear any active suggestion on state change — it was
|
|
184
|
-
// computed for the previous turn and the user has moved on.
|
|
185
|
-
setSuggestion(null);
|
|
186
|
-
suggestionAbortRef.current?.abort();
|
|
187
|
-
suggestionAbortRef.current = null;
|
|
188
|
-
if (process.env.CODEBASE_NO_SUGGESTIONS === "1")
|
|
189
|
-
return;
|
|
190
|
-
if (state.status !== "idle")
|
|
191
|
-
return;
|
|
192
|
-
if (state.messages.length < 2)
|
|
193
|
-
return;
|
|
194
|
-
const ac = new AbortController();
|
|
195
|
-
suggestionAbortRef.current = ac;
|
|
196
|
-
const timer = setTimeout(async () => {
|
|
197
|
-
if (ac.signal.aborted)
|
|
198
|
-
return;
|
|
199
|
-
try {
|
|
200
|
-
const text = await generateSuggestion(bundle, { signal: ac.signal });
|
|
201
|
-
if (ac.signal.aborted)
|
|
202
|
-
return;
|
|
203
|
-
if (text)
|
|
204
|
-
setSuggestion(text);
|
|
205
|
-
}
|
|
206
|
-
catch {
|
|
207
|
-
// Suggestion failures are silent — they're a nicety, not load-bearing.
|
|
208
|
-
}
|
|
209
|
-
}, 500);
|
|
210
|
-
return () => {
|
|
211
|
-
clearTimeout(timer);
|
|
212
|
-
ac.abort();
|
|
213
|
-
if (suggestionAbortRef.current === ac)
|
|
214
|
-
suggestionAbortRef.current = null;
|
|
215
|
-
};
|
|
216
|
-
}, [bundle, state.status, state.messages.length]);
|
|
110
|
+
const { suggestion, dismiss: dismissSuggestion } = usePromptSuggestion(bundle, state.status, state.messages.length);
|
|
217
111
|
const handleSubmit = async (text) => {
|
|
218
112
|
// `!cmd` runs a shell command directly — the CC convention for
|
|
219
113
|
// "I just want to check something real quick" without involving
|
|
@@ -267,7 +161,10 @@ function ChatApp({ bundle, onExit }) {
|
|
|
267
161
|
return;
|
|
268
162
|
}
|
|
269
163
|
if (route.kind === "plan") {
|
|
270
|
-
await runPlanFlow(text
|
|
164
|
+
await runPlanFlow(bundle, text, {
|
|
165
|
+
onReply: (replyText) => dispatch({ type: "chat-reply", text: replyText }),
|
|
166
|
+
onError: (message) => dispatch({ type: "error", message }),
|
|
167
|
+
});
|
|
271
168
|
return;
|
|
272
169
|
}
|
|
273
170
|
}
|
|
@@ -280,72 +177,6 @@ function ChatApp({ bundle, onExit }) {
|
|
|
280
177
|
dispatch({ type: "error", message: err instanceof Error ? err.message : String(err) });
|
|
281
178
|
});
|
|
282
179
|
};
|
|
283
|
-
/**
|
|
284
|
-
* Plan-mode flow:
|
|
285
|
-
* 1. Q&A loop (up to MAX_QUESTIONS, with the start-building escape).
|
|
286
|
-
* 2. Generate plan, render as a synthetic assistant message so the
|
|
287
|
-
* user can read it in chat.
|
|
288
|
-
* 3. Approve / Revise / Cancel via the UserQuery primitive.
|
|
289
|
-
* 4. On approve, hand the original prompt + plan + Q&A to the agent
|
|
290
|
-
* with the canonical buildAgentPrompt wrapper so weaker models
|
|
291
|
-
* stick to the plan instead of re-planning mid-execution.
|
|
292
|
-
*/
|
|
293
|
-
const runPlanFlow = async (originalPrompt) => {
|
|
294
|
-
const qaHistory = [];
|
|
295
|
-
try {
|
|
296
|
-
for (let i = 0; i < MAX_QUESTIONS; i++) {
|
|
297
|
-
const result = await generateQuestion(bundle.glue, originalPrompt, qaHistory, i);
|
|
298
|
-
if (result.done || !result.question)
|
|
299
|
-
break;
|
|
300
|
-
const q = result.question;
|
|
301
|
-
const optionLabels = q.options?.map((o) => o.label);
|
|
302
|
-
const answer = await bundle.userQueries.ask({
|
|
303
|
-
question: q.question,
|
|
304
|
-
options: optionLabels,
|
|
305
|
-
placeholder: optionLabels ? `1-${optionLabels.length}, or type a free-form answer` : undefined,
|
|
306
|
-
});
|
|
307
|
-
const resolved = parseAnswer(answer, q);
|
|
308
|
-
if (resolved === ANSWER_START_BUILDING)
|
|
309
|
-
break;
|
|
310
|
-
qaHistory.push({ question: q.question, answer: resolved });
|
|
311
|
-
}
|
|
312
|
-
let plan = await generatePlan(bundle.glue, originalPrompt, qaHistory);
|
|
313
|
-
while (true) {
|
|
314
|
-
dispatch({ type: "chat-reply", text: plan });
|
|
315
|
-
const decision = await bundle.userQueries.ask({
|
|
316
|
-
question: "Approve this plan and run it?",
|
|
317
|
-
options: ["Yes — run it", "Revise", "Cancel"],
|
|
318
|
-
});
|
|
319
|
-
const choice = matchOption(decision, ["Yes — run it", "Revise", "Cancel"]);
|
|
320
|
-
if (choice === "Yes — run it") {
|
|
321
|
-
const finalPrompt = buildAgentPrompt(originalPrompt, plan, qaHistory);
|
|
322
|
-
bundle.agent.prompt(finalPrompt).catch((err) => {
|
|
323
|
-
dispatch({ type: "error", message: err instanceof Error ? err.message : String(err) });
|
|
324
|
-
});
|
|
325
|
-
return;
|
|
326
|
-
}
|
|
327
|
-
if (choice === "Cancel") {
|
|
328
|
-
dispatch({ type: "chat-reply", text: "(plan cancelled)" });
|
|
329
|
-
return;
|
|
330
|
-
}
|
|
331
|
-
const feedback = await bundle.userQueries.ask({
|
|
332
|
-
question: "What should change about the plan?",
|
|
333
|
-
placeholder: "describe the revision",
|
|
334
|
-
});
|
|
335
|
-
plan = await revisePlan(bundle.glue, plan, feedback);
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
catch (err) {
|
|
339
|
-
if (err instanceof UserQueryCancelled) {
|
|
340
|
-
dispatch({ type: "chat-reply", text: "(plan cancelled)" });
|
|
341
|
-
return;
|
|
342
|
-
}
|
|
343
|
-
dispatch({
|
|
344
|
-
type: "error",
|
|
345
|
-
message: `plan flow failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
346
|
-
});
|
|
347
|
-
}
|
|
348
|
-
};
|
|
349
180
|
// Ctrl-C semantics:
|
|
350
181
|
// • While the agent is busy: abort the turn. Stays in the app.
|
|
351
182
|
// • A second Ctrl-C within DOUBLE_TAP_MS exits, regardless of
|
|
@@ -375,47 +206,7 @@ function ChatApp({ bundle, onExit }) {
|
|
|
375
206
|
}
|
|
376
207
|
appendStatus("Press Ctrl-C again to exit.");
|
|
377
208
|
};
|
|
378
|
-
return (_jsxs(Box, { flexDirection: "column", children: [state.messages.length === 0 && !state.streaming ? (_jsx(Welcome, { modelName: bundle.model.name, source: bundle.source, cwd: bundle.toolContext.cwd, resumedFrom: bundle.resumedFrom })) : (_jsxs(Box, { paddingX: 1, paddingY: 0, marginBottom: 1, children: [_jsx(Text, { bold: true, color: "cyan", children: "codebase" }), _jsxs(Text, { dimColor: true, children: [" \u00B7 ", bundle.model.name, " Model"] })] })), _jsx(MessageList, { messages: state.messages, streaming: state.streaming, tools: state.tools }), compactionState.active ? _jsx(CompactionBanner, { state: compactionState }) : null, _jsx(ToolPanel, { tools: state.tools }), _jsx(TaskPanel, { tasks: tasks }), statusLines.length > 0 ? (_jsx(Box, { flexDirection: "column", paddingX: 1, marginBottom: 1, children: statusLines.map((line, i) => (_jsx(Text, { dimColor: true, children: line }, `${i}-${line.slice(0, 8)}`))) })) : null, _jsx(Status, { state: state, cwd: bundle.toolContext.cwd }), permRequest ? (_jsx(Permission, { request: permRequest, onRespond: (choice) => bundle.permissions.respond(permRequest.id, choice) })) : userQuery ? (_jsx(UserQueryView, { query: userQuery, onAnswer: (answer) => bundle.userQueries.respond(userQuery.id, answer), onCancel: () => bundle.userQueries.cancel(userQuery.id) })) : (_jsx(Input, { disabled: busy, onSubmit: handleSubmit, onAbort: handleAbort, commands: commandSuggestions, history: inputHistory, cwd: bundle.toolContext.cwd, suggestion: suggestion, onSuggestionDismiss:
|
|
379
|
-
}
|
|
380
|
-
/**
|
|
381
|
-
* Run a one-shot `!command` and append its output to the status lines.
|
|
382
|
-
* This is intentionally divorced from the agent's shell tool — the
|
|
383
|
-
* agent's tool is for tool-use turns, this is a CLI escape so the user
|
|
384
|
-
* can `!git status` without spending a turn. Output is capped at 32 KB
|
|
385
|
-
* to keep the transcript from drowning.
|
|
386
|
-
*/
|
|
387
|
-
async function runShellEscape(command, cwd, emit) {
|
|
388
|
-
emit(`! ${command}`);
|
|
389
|
-
return new Promise((resolve) => {
|
|
390
|
-
const child = spawn(command, { shell: true, cwd, env: process.env });
|
|
391
|
-
let buffer = "";
|
|
392
|
-
const MAX = 32 * 1024;
|
|
393
|
-
const onChunk = (chunk) => {
|
|
394
|
-
if (buffer.length >= MAX)
|
|
395
|
-
return;
|
|
396
|
-
buffer += chunk.toString("utf8").slice(0, MAX - buffer.length);
|
|
397
|
-
};
|
|
398
|
-
child.stdout?.on("data", onChunk);
|
|
399
|
-
child.stderr?.on("data", onChunk);
|
|
400
|
-
child.on("close", (code) => {
|
|
401
|
-
const trimmed = buffer.trim();
|
|
402
|
-
if (trimmed.length === 0) {
|
|
403
|
-
emit(code === 0 ? "(no output)" : `(exit ${code})`);
|
|
404
|
-
}
|
|
405
|
-
else {
|
|
406
|
-
const lines = trimmed.split("\n").slice(0, 60);
|
|
407
|
-
for (const line of lines)
|
|
408
|
-
emit(line);
|
|
409
|
-
if (code !== 0)
|
|
410
|
-
emit(`(exit ${code})`);
|
|
411
|
-
}
|
|
412
|
-
resolve();
|
|
413
|
-
});
|
|
414
|
-
child.on("error", (err) => {
|
|
415
|
-
emit(`! ${err.message}`);
|
|
416
|
-
resolve();
|
|
417
|
-
});
|
|
418
|
-
});
|
|
209
|
+
return (_jsxs(Box, { flexDirection: "column", children: [state.messages.length === 0 && !state.streaming ? (_jsx(Welcome, { modelName: bundle.model.name, source: bundle.source, cwd: bundle.toolContext.cwd, resumedFrom: bundle.resumedFrom })) : (_jsxs(Box, { paddingX: 1, paddingY: 0, marginBottom: 1, children: [_jsx(Text, { bold: true, color: "cyan", children: "codebase" }), _jsxs(Text, { dimColor: true, children: [" \u00B7 ", bundle.model.name, " Model"] })] })), _jsx(MessageList, { messages: state.messages, streaming: state.streaming, tools: state.tools }), compactionState.active ? _jsx(CompactionBanner, { state: compactionState }) : null, _jsx(ToolPanel, { tools: state.tools }), _jsx(TaskPanel, { tasks: tasks }), statusLines.length > 0 ? (_jsx(Box, { flexDirection: "column", paddingX: 1, marginBottom: 1, children: statusLines.map((line, i) => (_jsx(Text, { dimColor: true, children: line }, `${i}-${line.slice(0, 8)}`))) })) : null, _jsx(Status, { state: state, cwd: bundle.toolContext.cwd }), permRequest ? (_jsx(Permission, { request: permRequest, onRespond: (choice) => bundle.permissions.respond(permRequest.id, choice) })) : userQuery ? (_jsx(UserQueryView, { query: userQuery, onAnswer: (answer) => bundle.userQueries.respond(userQuery.id, answer), onCancel: () => bundle.userQueries.cancel(userQuery.id) })) : (_jsx(Input, { disabled: busy, onSubmit: handleSubmit, onAbort: handleAbort, commands: commandSuggestions, history: inputHistory, cwd: bundle.toolContext.cwd, suggestion: suggestion, onSuggestionDismiss: dismissSuggestion }))] }));
|
|
419
210
|
}
|
|
420
211
|
/** Extract the user-visible text from a content array (image messages). */
|
|
421
212
|
function extractUserText(content) {
|
|
@@ -426,27 +217,6 @@ function extractUserText(content) {
|
|
|
426
217
|
.map((b) => b.text ?? "")
|
|
427
218
|
.join("");
|
|
428
219
|
}
|
|
429
|
-
/**
|
|
430
|
-
* Resolve a user's typed answer to one of the supplied options.
|
|
431
|
-
* Accepts the option label (case-insensitive), a 1-based index,
|
|
432
|
-
* or the leading word of the label. Falls back to the raw input
|
|
433
|
-
* if nothing matches — caller decides what to do with that.
|
|
434
|
-
*/
|
|
435
|
-
function matchOption(answer, options) {
|
|
436
|
-
const trimmed = answer.trim();
|
|
437
|
-
const idx = Number.parseInt(trimmed, 10);
|
|
438
|
-
if (Number.isFinite(idx) && idx >= 1 && idx <= options.length) {
|
|
439
|
-
return options[idx - 1];
|
|
440
|
-
}
|
|
441
|
-
const lower = trimmed.toLowerCase();
|
|
442
|
-
for (const option of options) {
|
|
443
|
-
if (option.toLowerCase() === lower)
|
|
444
|
-
return option;
|
|
445
|
-
if (option.toLowerCase().startsWith(lower) && lower.length >= 3)
|
|
446
|
-
return option;
|
|
447
|
-
}
|
|
448
|
-
return trimmed;
|
|
449
|
-
}
|
|
450
220
|
function ExitOnCtrlC({ onExit }) {
|
|
451
221
|
useEffect(() => {
|
|
452
222
|
const handler = () => onExit();
|
|
@@ -457,23 +227,4 @@ function ExitOnCtrlC({ onExit }) {
|
|
|
457
227
|
}, [onExit]);
|
|
458
228
|
return null;
|
|
459
229
|
}
|
|
460
|
-
/**
|
|
461
|
-
* Visible banner while the agent is summarising older turns into a
|
|
462
|
-
* compaction checkpoint. The work itself takes a few seconds on long
|
|
463
|
-
* sessions — silent before, looked like a hang. The banner re-renders
|
|
464
|
-
* its elapsed-seconds label every second so the user has a clear
|
|
465
|
-
* "still working" signal.
|
|
466
|
-
*/
|
|
467
|
-
function CompactionBanner({ state }) {
|
|
468
|
-
const [elapsed, setElapsed] = useState(0);
|
|
469
|
-
useEffect(() => {
|
|
470
|
-
if (!state.startedAt)
|
|
471
|
-
return;
|
|
472
|
-
const tick = () => setElapsed(Math.floor((Date.now() - (state.startedAt ?? Date.now())) / 1000));
|
|
473
|
-
tick();
|
|
474
|
-
const id = setInterval(tick, 1000);
|
|
475
|
-
return () => clearInterval(id);
|
|
476
|
-
}, [state.startedAt]);
|
|
477
|
-
return (_jsx(Box, { paddingX: 1, marginBottom: 0, children: _jsxs(Text, { color: "yellow", children: ["\u27F3 Compacting context (", state.messageCount, " messages", elapsed > 0 ? ` · ${elapsed}s` : "", ")\u2026"] }) }));
|
|
478
|
-
}
|
|
479
230
|
//# sourceMappingURL=App.js.map
|
package/dist/ui/App.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"App.js","sourceRoot":"","sources":["../../src/ui/App.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"App.js","sourceRoot":"","sources":["../../src/ui/App.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from "ink";
|
|
3
|
+
import { useEffect, useState } from "react";
|
|
4
|
+
/**
|
|
5
|
+
* Visible banner while the agent is summarising older turns into a
|
|
6
|
+
* compaction checkpoint. The work itself takes a few seconds on long
|
|
7
|
+
* sessions — silent before, looked like a hang. The banner re-renders
|
|
8
|
+
* its elapsed-seconds label every second so the user has a clear
|
|
9
|
+
* "still working" signal.
|
|
10
|
+
*/
|
|
11
|
+
export function CompactionBanner({ state }) {
|
|
12
|
+
const [elapsed, setElapsed] = useState(0);
|
|
13
|
+
useEffect(() => {
|
|
14
|
+
if (!state.startedAt)
|
|
15
|
+
return;
|
|
16
|
+
const tick = () => setElapsed(Math.floor((Date.now() - (state.startedAt ?? Date.now())) / 1000));
|
|
17
|
+
tick();
|
|
18
|
+
const id = setInterval(tick, 1000);
|
|
19
|
+
return () => clearInterval(id);
|
|
20
|
+
}, [state.startedAt]);
|
|
21
|
+
return (_jsx(Box, { paddingX: 1, marginBottom: 0, children: _jsxs(Text, { color: "yellow", children: ["\u27F3 Compacting context (", state.messageCount, " messages", elapsed > 0 ? ` · ${elapsed}s` : "", ")\u2026"] }) }));
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=CompactionBanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CompactionBanner.js","sourceRoot":"","sources":["../../src/ui/CompactionBanner.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAG5C;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAAE,KAAK,EAA8B;IACrE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC1C,SAAS,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,KAAK,CAAC,SAAS;YAAE,OAAO;QAC7B,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QACjG,IAAI,EAAE,CAAC;QACP,MAAM,EAAE,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACnC,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;IACtB,OAAO,CACN,KAAC,GAAG,IAAC,QAAQ,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,YAChC,MAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,4CACI,KAAK,CAAC,YAAY,eACxC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,eAC9B,GACF,CACN,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
/**
|
|
3
|
+
* Run a one-shot `!command` and append its output to the status lines.
|
|
4
|
+
* This is intentionally divorced from the agent's shell tool — the
|
|
5
|
+
* agent's tool is for tool-use turns, this is a CLI escape so the user
|
|
6
|
+
* can `!git status` without spending a turn. Output is capped at 32 KB
|
|
7
|
+
* to keep the transcript from drowning.
|
|
8
|
+
*/
|
|
9
|
+
export async function runShellEscape(command, cwd, emit) {
|
|
10
|
+
emit(`! ${command}`);
|
|
11
|
+
return new Promise((resolve) => {
|
|
12
|
+
const child = spawn(command, { shell: true, cwd, env: process.env });
|
|
13
|
+
let buffer = "";
|
|
14
|
+
const MAX = 32 * 1024;
|
|
15
|
+
const onChunk = (chunk) => {
|
|
16
|
+
if (buffer.length >= MAX)
|
|
17
|
+
return;
|
|
18
|
+
buffer += chunk.toString("utf8").slice(0, MAX - buffer.length);
|
|
19
|
+
};
|
|
20
|
+
child.stdout?.on("data", onChunk);
|
|
21
|
+
child.stderr?.on("data", onChunk);
|
|
22
|
+
child.on("close", (code) => {
|
|
23
|
+
const trimmed = buffer.trim();
|
|
24
|
+
if (trimmed.length === 0) {
|
|
25
|
+
emit(code === 0 ? "(no output)" : `(exit ${code})`);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
const lines = trimmed.split("\n").slice(0, 60);
|
|
29
|
+
for (const line of lines)
|
|
30
|
+
emit(line);
|
|
31
|
+
if (code !== 0)
|
|
32
|
+
emit(`(exit ${code})`);
|
|
33
|
+
}
|
|
34
|
+
resolve();
|
|
35
|
+
});
|
|
36
|
+
child.on("error", (err) => {
|
|
37
|
+
emit(`! ${err.message}`);
|
|
38
|
+
resolve();
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=shell-escape.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell-escape.js","sourceRoot":"","sources":["../../src/ui/shell-escape.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAe,EAAE,GAAW,EAAE,IAA4B;IAC9F,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;IACrB,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QACpC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACrE,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC;QACtB,MAAM,OAAO,GAAG,CAAC,KAAa,EAAE,EAAE;YACjC,IAAI,MAAM,CAAC,MAAM,IAAI,GAAG;gBAAE,OAAO;YACjC,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAChE,CAAC,CAAC;QACF,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAClC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAClC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YAC1B,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;YAC9B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,IAAI,GAAG,CAAC,CAAC;YACrD,CAAC;iBAAM,CAAC;gBACP,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC/C,KAAK,MAAM,IAAI,IAAI,KAAK;oBAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBACrC,IAAI,IAAI,KAAK,CAAC;oBAAE,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC,CAAC;YACxC,CAAC;YACD,OAAO,EAAE,CAAC;QACX,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACzB,IAAI,CAAC,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACzB,OAAO,EAAE,CAAC;QACX,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { useEffect, useRef } from "react";
|
|
2
|
+
/**
|
|
3
|
+
* Coalesce high-frequency streaming events (per-token assistant updates
|
|
4
|
+
* and per-chunk tool stdout) to one React commit per frame instead of
|
|
5
|
+
* per event. Pi-agent-core emits one message_update per token, and a
|
|
6
|
+
* fast model + long tool output can fire 100+ Hz — each dispatch runs
|
|
7
|
+
* the full reducer + React tree diff + Yoga layout for everything on
|
|
8
|
+
* screen. Throttling here is the single biggest cause of perceived
|
|
9
|
+
* scroll/render jankiness; everything else (Static for finalized
|
|
10
|
+
* messages, memoized children) is icing.
|
|
11
|
+
*
|
|
12
|
+
* Keyed coalescing: message_update has one slot, tool_execution_update
|
|
13
|
+
* has one slot per tool id. Latest event wins. Non-coalesceable events
|
|
14
|
+
* (message_start/end, tool_execution_start/end, turn_*, agent_*) flush
|
|
15
|
+
* any pending updates first so ordering stays correct.
|
|
16
|
+
*/
|
|
17
|
+
export function useCoalescedAgentEvents(bundle, dispatch) {
|
|
18
|
+
const pendingRef = useRef(new Map());
|
|
19
|
+
const flushTimerRef = useRef(null);
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
const STREAM_FRAME_MS = 16; // ~60fps cap
|
|
22
|
+
const flush = () => {
|
|
23
|
+
flushTimerRef.current = null;
|
|
24
|
+
if (pendingRef.current.size === 0)
|
|
25
|
+
return;
|
|
26
|
+
const events = [...pendingRef.current.values()];
|
|
27
|
+
pendingRef.current.clear();
|
|
28
|
+
for (const event of events) {
|
|
29
|
+
dispatch({ type: "agent-event", event });
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
const scheduleFlush = () => {
|
|
33
|
+
if (flushTimerRef.current != null)
|
|
34
|
+
return;
|
|
35
|
+
flushTimerRef.current = setTimeout(flush, STREAM_FRAME_MS);
|
|
36
|
+
};
|
|
37
|
+
const unsubscribe = bundle.subscribe((event) => {
|
|
38
|
+
if (event.type === "message_update") {
|
|
39
|
+
pendingRef.current.set("msg", event);
|
|
40
|
+
scheduleFlush();
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if (event.type === "tool_execution_update") {
|
|
44
|
+
pendingRef.current.set(`tool:${event.toolCallId}`, event);
|
|
45
|
+
scheduleFlush();
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
// Any other event flushes the queue before dispatching so the
|
|
49
|
+
// reducer sees pending streaming updates before the terminal
|
|
50
|
+
// event (message_end, tool_execution_end, etc.).
|
|
51
|
+
if (pendingRef.current.size > 0) {
|
|
52
|
+
if (flushTimerRef.current != null) {
|
|
53
|
+
clearTimeout(flushTimerRef.current);
|
|
54
|
+
flushTimerRef.current = null;
|
|
55
|
+
}
|
|
56
|
+
flush();
|
|
57
|
+
}
|
|
58
|
+
dispatch({ type: "agent-event", event });
|
|
59
|
+
});
|
|
60
|
+
return () => {
|
|
61
|
+
unsubscribe();
|
|
62
|
+
if (flushTimerRef.current != null) {
|
|
63
|
+
clearTimeout(flushTimerRef.current);
|
|
64
|
+
flushTimerRef.current = null;
|
|
65
|
+
}
|
|
66
|
+
pendingRef.current.clear();
|
|
67
|
+
};
|
|
68
|
+
}, [bundle, dispatch]);
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=use-coalesced-agent-events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-coalesced-agent-events.js","sourceRoot":"","sources":["../../src/ui/use-coalesced-agent-events.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAK1C;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAAmB,EAAE,QAAkB;IAC9E,MAAM,UAAU,GAAG,MAAM,CAA0B,IAAI,GAAG,EAAE,CAAC,CAAC;IAC9D,MAAM,aAAa,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAC;IAE1D,SAAS,CAAC,GAAG,EAAE;QACd,MAAM,eAAe,GAAG,EAAE,CAAC,CAAC,aAAa;QAEzC,MAAM,KAAK,GAAG,GAAG,EAAE;YAClB,aAAa,CAAC,OAAO,GAAG,IAAI,CAAC;YAC7B,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC;gBAAE,OAAO;YAC1C,MAAM,MAAM,GAAG,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YAChD,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC3B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC5B,QAAQ,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;YAC1C,CAAC;QACF,CAAC,CAAC;QAEF,MAAM,aAAa,GAAG,GAAG,EAAE;YAC1B,IAAI,aAAa,CAAC,OAAO,IAAI,IAAI;gBAAE,OAAO;YAC1C,aAAa,CAAC,OAAO,GAAG,UAAU,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;QAC5D,CAAC,CAAC;QAEF,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;YAC9C,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;gBACrC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBACrC,aAAa,EAAE,CAAC;gBAChB,OAAO;YACR,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,uBAAuB,EAAE,CAAC;gBAC5C,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,CAAC,UAAU,EAAE,EAAE,KAAK,CAAC,CAAC;gBAC1D,aAAa,EAAE,CAAC;gBAChB,OAAO;YACR,CAAC;YACD,8DAA8D;YAC9D,6DAA6D;YAC7D,iDAAiD;YACjD,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBACjC,IAAI,aAAa,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC;oBACnC,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;oBACpC,aAAa,CAAC,OAAO,GAAG,IAAI,CAAC;gBAC9B,CAAC;gBACD,KAAK,EAAE,CAAC;YACT,CAAC;YACD,QAAQ,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,OAAO,GAAG,EAAE;YACX,WAAW,EAAE,CAAC;YACd,IAAI,aAAa,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC;gBACnC,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;gBACpC,aAAa,CAAC,OAAO,GAAG,IAAI,CAAC;YAC9B,CAAC;YACD,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC5B,CAAC,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { useEffect, useRef, useState } from "react";
|
|
2
|
+
import { generateSuggestion } from "../agent/prompt-suggestion.js";
|
|
3
|
+
/**
|
|
4
|
+
* Inline prompt-suggestion ghost text. Schedules a single forecast
|
|
5
|
+
* call when the agent goes idle; cancels the prior call on every new
|
|
6
|
+
* state change so we never race two suggestions or show a stale one
|
|
7
|
+
* after the user starts a new turn. 500ms debounce lets idle settle
|
|
8
|
+
* (e.g. agent finishes, a quick status emit follows, we don't want to
|
|
9
|
+
* fire twice). Disabled via env so users on metered BYOK providers
|
|
10
|
+
* can opt out.
|
|
11
|
+
*/
|
|
12
|
+
export function usePromptSuggestion(bundle, status, messageCount) {
|
|
13
|
+
const [suggestion, setSuggestion] = useState(null);
|
|
14
|
+
const abortRef = useRef(null);
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
// Always clear any active suggestion on state change — it was
|
|
17
|
+
// computed for the previous turn and the user has moved on.
|
|
18
|
+
setSuggestion(null);
|
|
19
|
+
abortRef.current?.abort();
|
|
20
|
+
abortRef.current = null;
|
|
21
|
+
if (process.env.CODEBASE_NO_SUGGESTIONS === "1")
|
|
22
|
+
return;
|
|
23
|
+
if (status !== "idle")
|
|
24
|
+
return;
|
|
25
|
+
if (messageCount < 2)
|
|
26
|
+
return;
|
|
27
|
+
const ac = new AbortController();
|
|
28
|
+
abortRef.current = ac;
|
|
29
|
+
const timer = setTimeout(async () => {
|
|
30
|
+
if (ac.signal.aborted)
|
|
31
|
+
return;
|
|
32
|
+
try {
|
|
33
|
+
const text = await generateSuggestion(bundle, { signal: ac.signal });
|
|
34
|
+
if (ac.signal.aborted)
|
|
35
|
+
return;
|
|
36
|
+
if (text)
|
|
37
|
+
setSuggestion(text);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// Suggestion failures are silent — they're a nicety, not load-bearing.
|
|
41
|
+
}
|
|
42
|
+
}, 500);
|
|
43
|
+
return () => {
|
|
44
|
+
clearTimeout(timer);
|
|
45
|
+
ac.abort();
|
|
46
|
+
if (abortRef.current === ac)
|
|
47
|
+
abortRef.current = null;
|
|
48
|
+
};
|
|
49
|
+
}, [bundle, status, messageCount]);
|
|
50
|
+
return { suggestion, dismiss: () => setSuggestion(null) };
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=use-prompt-suggestion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-prompt-suggestion.js","sourceRoot":"","sources":["../../src/ui/use-prompt-suggestion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAEnE;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAClC,MAAmB,EACnB,MAAc,EACd,YAAoB;IAEpB,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAClE,MAAM,QAAQ,GAAG,MAAM,CAAyB,IAAI,CAAC,CAAC;IAEtD,SAAS,CAAC,GAAG,EAAE;QACd,8DAA8D;QAC9D,4DAA4D;QAC5D,aAAa,CAAC,IAAI,CAAC,CAAC;QACpB,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QAC1B,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;QAExB,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,GAAG;YAAE,OAAO;QACxD,IAAI,MAAM,KAAK,MAAM;YAAE,OAAO;QAC9B,IAAI,YAAY,GAAG,CAAC;YAAE,OAAO;QAE7B,MAAM,EAAE,GAAG,IAAI,eAAe,EAAE,CAAC;QACjC,QAAQ,CAAC,OAAO,GAAG,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE;YACnC,IAAI,EAAE,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAO;YAC9B,IAAI,CAAC;gBACJ,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;gBACrE,IAAI,EAAE,CAAC,MAAM,CAAC,OAAO;oBAAE,OAAO;gBAC9B,IAAI,IAAI;oBAAE,aAAa,CAAC,IAAI,CAAC,CAAC;YAC/B,CAAC;YAAC,MAAM,CAAC;gBACR,uEAAuE;YACxE,CAAC;QACF,CAAC,EAAE,GAAG,CAAC,CAAC;QAER,OAAO,GAAG,EAAE;YACX,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,QAAQ,CAAC,OAAO,KAAK,EAAE;gBAAE,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;QACtD,CAAC,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;IAEnC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;AAC3D,CAAC"}
|
package/package.json
CHANGED