@kenkaiiii/ggcoder 4.3.216 → 4.3.218
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/cli/command-routing.d.ts +28 -0
- package/dist/cli/command-routing.d.ts.map +1 -0
- package/dist/cli/command-routing.js +51 -0
- package/dist/cli/command-routing.js.map +1 -0
- package/dist/cli/command-routing.test.d.ts +2 -0
- package/dist/cli/command-routing.test.d.ts.map +1 -0
- package/dist/cli/command-routing.test.js +59 -0
- package/dist/cli/command-routing.test.js.map +1 -0
- package/dist/cli.d.ts +3 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +63 -108
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +2 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +6 -0
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session-compaction.test.d.ts +2 -0
- package/dist/core/agent-session-compaction.test.d.ts.map +1 -0
- package/dist/core/agent-session-compaction.test.js +121 -0
- package/dist/core/agent-session-compaction.test.js.map +1 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +6 -7
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/goal-controller.d.ts.map +1 -1
- package/dist/core/goal-controller.js +46 -1
- package/dist/core/goal-controller.js.map +1 -1
- package/dist/core/goal-controller.test.js +39 -0
- package/dist/core/goal-controller.test.js.map +1 -1
- package/dist/core/goal-store.d.ts +18 -0
- package/dist/core/goal-store.d.ts.map +1 -1
- package/dist/core/goal-store.js +48 -0
- package/dist/core/goal-store.js.map +1 -1
- package/dist/core/goal-store.test.js +10 -0
- package/dist/core/goal-store.test.js.map +1 -1
- package/dist/core/goal-worker.d.ts +9 -1
- package/dist/core/goal-worker.d.ts.map +1 -1
- package/dist/core/goal-worker.js +66 -19
- package/dist/core/goal-worker.js.map +1 -1
- package/dist/core/goal-worker.test.js +120 -1
- package/dist/core/goal-worker.test.js.map +1 -1
- package/dist/core/goal-worktree.d.ts +33 -0
- package/dist/core/goal-worktree.d.ts.map +1 -0
- package/dist/core/goal-worktree.js +67 -0
- package/dist/core/goal-worktree.js.map +1 -0
- package/dist/core/goal-worktree.test.d.ts +2 -0
- package/dist/core/goal-worktree.test.d.ts.map +1 -0
- package/dist/core/goal-worktree.test.js +101 -0
- package/dist/core/goal-worktree.test.js.map +1 -0
- package/dist/core/repomap-budget.d.ts +7 -0
- package/dist/core/repomap-budget.d.ts.map +1 -0
- package/dist/core/repomap-budget.js +10 -0
- package/dist/core/repomap-budget.js.map +1 -0
- package/dist/core/repomap-budget.test.d.ts +2 -0
- package/dist/core/repomap-budget.test.d.ts.map +1 -0
- package/dist/core/repomap-budget.test.js +26 -0
- package/dist/core/repomap-budget.test.js.map +1 -0
- package/dist/system-prompt.d.ts.map +1 -1
- package/dist/system-prompt.js +4 -0
- package/dist/system-prompt.js.map +1 -1
- package/dist/system-prompt.test.js +18 -0
- package/dist/system-prompt.test.js.map +1 -1
- package/dist/tools/goals.d.ts +9 -0
- package/dist/tools/goals.d.ts.map +1 -1
- package/dist/tools/goals.js +79 -27
- package/dist/tools/goals.js.map +1 -1
- package/dist/tools/goals.test.js +91 -22
- package/dist/tools/goals.test.js.map +1 -1
- package/dist/ui/App.d.ts +11 -385
- package/dist/ui/App.d.ts.map +1 -1
- package/dist/ui/App.js +109 -559
- package/dist/ui/App.js.map +1 -1
- package/dist/ui/app-items.d.ts +207 -0
- package/dist/ui/app-items.d.ts.map +1 -0
- package/dist/ui/app-items.js +2 -0
- package/dist/ui/app-items.js.map +1 -0
- package/dist/ui/app-state-persistence.test.js +4 -1
- package/dist/ui/app-state-persistence.test.js.map +1 -1
- package/dist/ui/chat-layout-pinning.test.js +11 -1
- package/dist/ui/chat-layout-pinning.test.js.map +1 -1
- package/dist/ui/components/AnimationContext.d.ts.map +1 -1
- package/dist/ui/components/AnimationContext.js +3 -5
- package/dist/ui/components/AnimationContext.js.map +1 -1
- package/dist/ui/components/AssistantMessage.test.js +12 -12
- package/dist/ui/components/AssistantMessage.test.js.map +1 -1
- package/dist/ui/components/CompactionNotice.js +2 -2
- package/dist/ui/components/CompactionNotice.js.map +1 -1
- package/dist/ui/components/Footer.d.ts +1 -0
- package/dist/ui/components/Footer.d.ts.map +1 -1
- package/dist/ui/components/Footer.js +5 -2
- package/dist/ui/components/Footer.js.map +1 -1
- package/dist/ui/components/ServerToolExecution.d.ts.map +1 -1
- package/dist/ui/components/ServerToolExecution.js +5 -23
- package/dist/ui/components/ServerToolExecution.js.map +1 -1
- package/dist/ui/components/SubAgentPanel.d.ts.map +1 -1
- package/dist/ui/components/SubAgentPanel.js +3 -2
- package/dist/ui/components/SubAgentPanel.js.map +1 -1
- package/dist/ui/components/ToolExecution.d.ts.map +1 -1
- package/dist/ui/components/ToolExecution.js +12 -30
- package/dist/ui/components/ToolExecution.js.map +1 -1
- package/dist/ui/components/ToolGroupExecution.d.ts.map +1 -1
- package/dist/ui/components/ToolGroupExecution.js +5 -24
- package/dist/ui/components/ToolGroupExecution.js.map +1 -1
- package/dist/ui/components/ToolUseLoader.d.ts +3 -1
- package/dist/ui/components/ToolUseLoader.d.ts.map +1 -1
- package/dist/ui/components/ToolUseLoader.js +2 -2
- package/dist/ui/components/ToolUseLoader.js.map +1 -1
- package/dist/ui/footer-status-layout.test.js +9 -1
- package/dist/ui/footer-status-layout.test.js.map +1 -1
- package/dist/ui/goal-events.d.ts +4 -0
- package/dist/ui/goal-events.d.ts.map +1 -1
- package/dist/ui/goal-events.js +19 -1
- package/dist/ui/goal-events.js.map +1 -1
- package/dist/ui/goal-events.test.js +15 -1
- package/dist/ui/goal-events.test.js.map +1 -1
- package/dist/ui/goal-lifecycle-orchestration.test.js +20 -1
- package/dist/ui/goal-lifecycle-orchestration.test.js.map +1 -1
- package/dist/ui/goal-progress.d.ts +31 -0
- package/dist/ui/goal-progress.d.ts.map +1 -0
- package/dist/ui/goal-progress.js +152 -0
- package/dist/ui/goal-progress.js.map +1 -0
- package/dist/ui/item-helpers.d.ts +24 -0
- package/dist/ui/item-helpers.d.ts.map +1 -0
- package/dist/ui/item-helpers.js +96 -0
- package/dist/ui/item-helpers.js.map +1 -0
- package/dist/ui/layout-decisions.d.ts +113 -0
- package/dist/ui/layout-decisions.d.ts.map +1 -0
- package/dist/ui/layout-decisions.js +173 -0
- package/dist/ui/layout-decisions.js.map +1 -0
- package/dist/ui/prompt-routing.d.ts +29 -0
- package/dist/ui/prompt-routing.d.ts.map +1 -0
- package/dist/ui/prompt-routing.js +105 -0
- package/dist/ui/prompt-routing.js.map +1 -0
- package/dist/ui/queued-message.test.js +19 -1
- package/dist/ui/queued-message.test.js.map +1 -1
- package/dist/ui/render.d.ts +1 -0
- package/dist/ui/render.d.ts.map +1 -1
- package/dist/ui/render.js +1 -0
- package/dist/ui/render.js.map +1 -1
- package/dist/ui/scroll-stabilization.test.js +1 -1
- package/dist/ui/scroll-stabilization.test.js.map +1 -1
- package/dist/ui/slash-command-images.test.js +1 -1
- package/dist/ui/slash-command-images.test.js.map +1 -1
- package/dist/ui/terminal-history-format.d.ts +41 -0
- package/dist/ui/terminal-history-format.d.ts.map +1 -0
- package/dist/ui/terminal-history-format.js +131 -0
- package/dist/ui/terminal-history-format.js.map +1 -0
- package/dist/ui/terminal-history-spacing.d.ts +3 -0
- package/dist/ui/terminal-history-spacing.d.ts.map +1 -0
- package/dist/ui/terminal-history-spacing.js +28 -0
- package/dist/ui/terminal-history-spacing.js.map +1 -0
- package/dist/ui/terminal-history-status-renderers.d.ts +16 -0
- package/dist/ui/terminal-history-status-renderers.d.ts.map +1 -0
- package/dist/ui/terminal-history-status-renderers.js +83 -0
- package/dist/ui/terminal-history-status-renderers.js.map +1 -0
- package/dist/ui/terminal-history.d.ts.map +1 -1
- package/dist/ui/terminal-history.js +30 -246
- package/dist/ui/terminal-history.js.map +1 -1
- package/dist/ui/terminal-history.test.js +21 -7
- package/dist/ui/terminal-history.test.js.map +1 -1
- package/dist/ui/thinking-level-cycle.test.d.ts +2 -0
- package/dist/ui/thinking-level-cycle.test.d.ts.map +1 -0
- package/dist/ui/thinking-level-cycle.test.js +25 -0
- package/dist/ui/thinking-level-cycle.test.js.map +1 -0
- package/dist/ui/thinking-level.d.ts +5 -0
- package/dist/ui/thinking-level.d.ts.map +1 -0
- package/dist/ui/thinking-level.js +30 -0
- package/dist/ui/thinking-level.js.map +1 -0
- package/dist/ui/tool-group-summary.d.ts.map +1 -1
- package/dist/ui/tool-group-summary.js +117 -8
- package/dist/ui/tool-group-summary.js.map +1 -1
- package/dist/ui/tool-group-summary.test.d.ts +2 -0
- package/dist/ui/tool-group-summary.test.d.ts.map +1 -0
- package/dist/ui/tool-group-summary.test.js +79 -0
- package/dist/ui/tool-group-summary.test.js.map +1 -0
- package/dist/ui/tui-history-parity.test.js +34 -13
- package/dist/ui/tui-history-parity.test.js.map +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { formatGoalBlockingPrerequisites, goalHasBlockingPrerequisites, } from "../core/goal-store.js";
|
|
2
|
+
import { buildGoalFinalSummarySections, buildGoalSummaryRows, goalPassedDetail, } from "./goal-summary.js";
|
|
3
|
+
function summarizeGoalCompletion(summary) {
|
|
4
|
+
const lines = summary
|
|
5
|
+
.split("\n")
|
|
6
|
+
.map((line) => line.trim())
|
|
7
|
+
.filter((line) => line.length > 0 && line !== "[agent_done]");
|
|
8
|
+
const statusLine = lines.find((line) => /^Status:/i.test(line));
|
|
9
|
+
const changedLine = lines.find((line) => /^(Changed|Implemented|Fixed|Added|Key findings|Full verifier)/i.test(line));
|
|
10
|
+
const verificationLine = lines.find((line) => /^(Verification|Verified|Result):/i.test(line));
|
|
11
|
+
return statusLine ?? changedLine ?? verificationLine ?? lines[0];
|
|
12
|
+
}
|
|
13
|
+
const GOAL_PROGRESS_TEXT_LIMIT = 72;
|
|
14
|
+
export function truncateGoalProgressText(text) {
|
|
15
|
+
const normalized = text.replace(/\s+/g, " ").trim();
|
|
16
|
+
if (normalized.length <= GOAL_PROGRESS_TEXT_LIMIT)
|
|
17
|
+
return normalized;
|
|
18
|
+
return `${normalized.slice(0, GOAL_PROGRESS_TEXT_LIMIT - 1).trimEnd()}…`;
|
|
19
|
+
}
|
|
20
|
+
export function formatGoalWorkerFinishedTitle(taskTitle, status) {
|
|
21
|
+
const prefix = status === "done" ? "Done" : "Failed";
|
|
22
|
+
return truncateGoalProgressText(`${prefix}: ${taskTitle}`);
|
|
23
|
+
}
|
|
24
|
+
export function summarizeGoalWorkerCompletion(summary) {
|
|
25
|
+
return summarizeGoalCompletion(summary);
|
|
26
|
+
}
|
|
27
|
+
export { summarizeGoalCompletion };
|
|
28
|
+
export function goalTerminalProgressId(run) {
|
|
29
|
+
return `goal-terminal-${run.id}`;
|
|
30
|
+
}
|
|
31
|
+
function goalTerminalRunIdFromItem(item) {
|
|
32
|
+
if (item.kind !== "goal_progress" || item.phase !== "terminal")
|
|
33
|
+
return undefined;
|
|
34
|
+
if (!item.id.startsWith("goal-terminal-"))
|
|
35
|
+
return undefined;
|
|
36
|
+
return item.id.slice("goal-terminal-".length);
|
|
37
|
+
}
|
|
38
|
+
function goalProgressMatchesDraft(item, draft) {
|
|
39
|
+
return (item.phase === draft.phase &&
|
|
40
|
+
item.title === draft.title &&
|
|
41
|
+
item.detail === draft.detail &&
|
|
42
|
+
item.workerId === draft.workerId &&
|
|
43
|
+
item.status === draft.status &&
|
|
44
|
+
JSON.stringify(item.summaryRows ?? []) === JSON.stringify(draft.summaryRows ?? []) &&
|
|
45
|
+
JSON.stringify(item.summarySections ?? []) === JSON.stringify(draft.summarySections ?? []));
|
|
46
|
+
}
|
|
47
|
+
export function appendGoalProgressDraft(items, draft, makeId) {
|
|
48
|
+
const previous = items.at(-1);
|
|
49
|
+
if (previous?.kind === "goal_progress" && goalProgressMatchesDraft(previous, draft)) {
|
|
50
|
+
return items;
|
|
51
|
+
}
|
|
52
|
+
return [...items, { ...draft, id: makeId() }];
|
|
53
|
+
}
|
|
54
|
+
export function completedItemsWithDurableGoalTerminalProgress(items, runs) {
|
|
55
|
+
const runIds = new Set(runs.map((run) => run.id));
|
|
56
|
+
const terminalByRun = new Map(runs
|
|
57
|
+
.map((run) => [run.id, formatGoalTerminalProgress(run)])
|
|
58
|
+
.filter((entry) => entry[1] !== null));
|
|
59
|
+
if (runIds.size === 0)
|
|
60
|
+
return items;
|
|
61
|
+
let changed = false;
|
|
62
|
+
const reconciled = items.map((item, index) => {
|
|
63
|
+
const runId = goalTerminalRunIdFromItem(item);
|
|
64
|
+
if (!runId || !runIds.has(runId))
|
|
65
|
+
return item;
|
|
66
|
+
const draft = terminalByRun.get(runId);
|
|
67
|
+
if (draft && goalProgressMatchesDraft(item, draft))
|
|
68
|
+
return item;
|
|
69
|
+
changed = true;
|
|
70
|
+
return { kind: "tombstone", id: `tombstone-${item.id}-${index}` };
|
|
71
|
+
});
|
|
72
|
+
return changed ? reconciled : items;
|
|
73
|
+
}
|
|
74
|
+
export function formatGoalTerminalProgress(run) {
|
|
75
|
+
switch (run.status) {
|
|
76
|
+
case "passed":
|
|
77
|
+
return {
|
|
78
|
+
kind: "goal_progress",
|
|
79
|
+
phase: "terminal",
|
|
80
|
+
title: `Goal passed: ${run.title}`,
|
|
81
|
+
detail: goalPassedDetail(run),
|
|
82
|
+
summaryRows: buildGoalSummaryRows(run),
|
|
83
|
+
summarySections: buildGoalFinalSummarySections(run),
|
|
84
|
+
status: run.status,
|
|
85
|
+
};
|
|
86
|
+
case "failed":
|
|
87
|
+
return {
|
|
88
|
+
kind: "goal_progress",
|
|
89
|
+
phase: "terminal",
|
|
90
|
+
title: `Goal failed: ${run.title}`,
|
|
91
|
+
detail: "Auto-continuation stopped. Check Goal tasks for the failing step.",
|
|
92
|
+
summaryRows: buildGoalSummaryRows(run),
|
|
93
|
+
status: run.status,
|
|
94
|
+
};
|
|
95
|
+
case "blocked":
|
|
96
|
+
return {
|
|
97
|
+
kind: "goal_progress",
|
|
98
|
+
phase: "terminal",
|
|
99
|
+
title: `Goal blocked: ${run.title}`,
|
|
100
|
+
detail: goalHasBlockingPrerequisites(run)
|
|
101
|
+
? formatGoalBlockingPrerequisites(run)
|
|
102
|
+
: (run.blockers[0] ?? "A prerequisite or missing verifier blocked progress."),
|
|
103
|
+
summaryRows: buildGoalSummaryRows(run),
|
|
104
|
+
status: run.status,
|
|
105
|
+
};
|
|
106
|
+
case "paused":
|
|
107
|
+
return {
|
|
108
|
+
kind: "goal_progress",
|
|
109
|
+
phase: "terminal",
|
|
110
|
+
title: `Goal paused: ${run.title}`,
|
|
111
|
+
detail: run.blockers[0] ?? "Auto-continuation paused.",
|
|
112
|
+
summaryRows: buildGoalSummaryRows(run),
|
|
113
|
+
status: run.status,
|
|
114
|
+
};
|
|
115
|
+
case "draft":
|
|
116
|
+
case "ready":
|
|
117
|
+
case "running":
|
|
118
|
+
case "verifying":
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
export function getGoalContinuationChoiceKey({ runId, decision, }) {
|
|
123
|
+
switch (decision.kind) {
|
|
124
|
+
case "create_task":
|
|
125
|
+
return `${runId}:create_task:${decision.title}:${decision.prompt}`;
|
|
126
|
+
case "start_worker":
|
|
127
|
+
case "pause":
|
|
128
|
+
return `${runId}:${decision.kind}:${decision.task.id}:${decision.attempts}`;
|
|
129
|
+
case "run_verifier":
|
|
130
|
+
return `${runId}:run_verifier:${decision.command}`;
|
|
131
|
+
case "blocked":
|
|
132
|
+
case "complete":
|
|
133
|
+
case "terminal":
|
|
134
|
+
case "wait":
|
|
135
|
+
return `${runId}:${decision.kind}:${decision.reason}`;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
export function routeGoalSyntheticEvent({ agentRunning, queuedSyntheticEvents, }) {
|
|
139
|
+
if (agentRunning) {
|
|
140
|
+
return {
|
|
141
|
+
action: "queue",
|
|
142
|
+
nextQueuedSyntheticEvents: queuedSyntheticEvents + 1,
|
|
143
|
+
nextGoalMode: "coordinator",
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
return {
|
|
147
|
+
action: "run",
|
|
148
|
+
nextQueuedSyntheticEvents: queuedSyntheticEvents,
|
|
149
|
+
nextGoalMode: "coordinator",
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=goal-progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"goal-progress.js","sourceRoot":"","sources":["../../src/ui/goal-progress.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { CompletedItem } from "./app-items.js";
|
|
2
|
+
export declare function compactHistory(items: CompletedItem[]): CompletedItem[];
|
|
3
|
+
export declare function getNextGeneratedItemId(items: readonly Pick<CompletedItem, "id">[]): number;
|
|
4
|
+
/** Check whether an item is still active (running spinner, pending result). */
|
|
5
|
+
export declare function isActiveItem(item: CompletedItem): boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Partition live items into completed (flushable to finalized history) and still-active.
|
|
8
|
+
* Completed items precede active ones — we flush the longest contiguous prefix
|
|
9
|
+
* of completed items to keep ordering stable.
|
|
10
|
+
*/
|
|
11
|
+
export declare function partitionCompleted(items: CompletedItem[]): {
|
|
12
|
+
flushed: CompletedItem[];
|
|
13
|
+
remaining: CompletedItem[];
|
|
14
|
+
};
|
|
15
|
+
export declare function normalizeAssistantText(text: string): string;
|
|
16
|
+
export declare function isSameAssistantText(item: CompletedItem, text: string): boolean;
|
|
17
|
+
export declare function pinStreamingTextBeforeToolBoundary({ items, visibleStreamingText, thinking, thinkingMs, makeId, }: {
|
|
18
|
+
items: CompletedItem[];
|
|
19
|
+
visibleStreamingText: string;
|
|
20
|
+
thinking: string;
|
|
21
|
+
thinkingMs: number;
|
|
22
|
+
makeId: () => string;
|
|
23
|
+
}): CompletedItem[];
|
|
24
|
+
//# sourceMappingURL=item-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"item-helpers.d.ts","sourceRoot":"","sources":["../../src/ui/item-helpers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAoC,MAAM,gBAAgB,CAAC;AAQtF,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,aAAa,EAAE,CAYtE;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,SAAS,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,EAAE,GAAG,MAAM,CAQ1F;AAED,+EAA+E;AAC/E,wBAAgB,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAczD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG;IAC1D,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,SAAS,EAAE,aAAa,EAAE,CAAC;CAC5B,CAgBA;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3D;AAKD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE9E;AAED,wBAAgB,kCAAkC,CAAC,EACjD,KAAK,EACL,oBAAoB,EACpB,QAAQ,EACR,UAAU,EACV,MAAM,GACP,EAAE;IACD,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,MAAM,CAAC;CACtB,GAAG,aAAa,EAAE,CAclB"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { stripDoneMarkers } from "../utils/plan-steps.js";
|
|
2
|
+
/**
|
|
3
|
+
* Cap memory by replacing old finalized rows with tiny tombstones. The full
|
|
4
|
+
* transcript is already printed into terminal scrollback, so the in-memory copy
|
|
5
|
+
* only needs enough recent structure to survive remounts and session mirroring.
|
|
6
|
+
*/
|
|
7
|
+
const MAX_LIVE_HISTORY = 200;
|
|
8
|
+
export function compactHistory(items) {
|
|
9
|
+
if (items.length <= MAX_LIVE_HISTORY)
|
|
10
|
+
return items;
|
|
11
|
+
const cutoff = items.length - MAX_LIVE_HISTORY;
|
|
12
|
+
const compacted = new Array(items.length);
|
|
13
|
+
for (let i = 0; i < cutoff; i++) {
|
|
14
|
+
const it = items[i];
|
|
15
|
+
compacted[i] = it.kind === "tombstone" ? it : { kind: "tombstone", id: it.id };
|
|
16
|
+
}
|
|
17
|
+
for (let i = cutoff; i < items.length; i++) {
|
|
18
|
+
compacted[i] = items[i];
|
|
19
|
+
}
|
|
20
|
+
return compacted;
|
|
21
|
+
}
|
|
22
|
+
export function getNextGeneratedItemId(items) {
|
|
23
|
+
let max = -1;
|
|
24
|
+
for (const item of items) {
|
|
25
|
+
const raw = item.id.startsWith("ui-") ? item.id.slice(3) : item.id;
|
|
26
|
+
const n = Number(raw);
|
|
27
|
+
if (Number.isInteger(n) && n >= 0 && n > max)
|
|
28
|
+
max = n;
|
|
29
|
+
}
|
|
30
|
+
return max + 1;
|
|
31
|
+
}
|
|
32
|
+
/** Check whether an item is still active (running spinner, pending result). */
|
|
33
|
+
export function isActiveItem(item) {
|
|
34
|
+
switch (item.kind) {
|
|
35
|
+
case "tool_start":
|
|
36
|
+
case "server_tool_start":
|
|
37
|
+
case "queued":
|
|
38
|
+
case "compacting":
|
|
39
|
+
return true;
|
|
40
|
+
case "tool_group":
|
|
41
|
+
return item.tools.some((t) => t.status === "running");
|
|
42
|
+
case "subagent_group":
|
|
43
|
+
return item.agents.some((a) => a.status === "running");
|
|
44
|
+
default:
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Partition live items into completed (flushable to finalized history) and still-active.
|
|
50
|
+
* Completed items precede active ones — we flush the longest contiguous prefix
|
|
51
|
+
* of completed items to keep ordering stable.
|
|
52
|
+
*/
|
|
53
|
+
export function partitionCompleted(items) {
|
|
54
|
+
// Find the first active item — everything before it is safe to flush as a
|
|
55
|
+
// single chronological prefix. Splitting assistant text out of that prefix
|
|
56
|
+
// lets later tool rows print to scrollback above the message that introduced
|
|
57
|
+
// them, so keep the prefix intact.
|
|
58
|
+
const firstActiveIdx = items.findIndex(isActiveItem);
|
|
59
|
+
if (firstActiveIdx === -1) {
|
|
60
|
+
return { flushed: items, remaining: [] };
|
|
61
|
+
}
|
|
62
|
+
if (firstActiveIdx === 0) {
|
|
63
|
+
return { flushed: [], remaining: items };
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
flushed: items.slice(0, firstActiveIdx),
|
|
67
|
+
remaining: items.slice(firstActiveIdx),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
export function normalizeAssistantText(text) {
|
|
71
|
+
return stripDoneMarkers(text).trim();
|
|
72
|
+
}
|
|
73
|
+
function isReasoningMarkerText(text) {
|
|
74
|
+
return /^(?:currentItem\?\.type\s*=+\s*)?["']?reasoning["']?$/u.test(text.trim());
|
|
75
|
+
}
|
|
76
|
+
export function isSameAssistantText(item, text) {
|
|
77
|
+
return item.kind === "assistant" && normalizeAssistantText(item.text) === text;
|
|
78
|
+
}
|
|
79
|
+
export function pinStreamingTextBeforeToolBoundary({ items, visibleStreamingText, thinking, thinkingMs, makeId, }) {
|
|
80
|
+
const text = normalizeAssistantText(visibleStreamingText);
|
|
81
|
+
if (text.length === 0 || isReasoningMarkerText(text))
|
|
82
|
+
return items;
|
|
83
|
+
if (items.some((item) => item.kind === "assistant"))
|
|
84
|
+
return items;
|
|
85
|
+
return [
|
|
86
|
+
...items,
|
|
87
|
+
{
|
|
88
|
+
kind: "assistant",
|
|
89
|
+
text,
|
|
90
|
+
thinking: thinking.length > 0 ? thinking : undefined,
|
|
91
|
+
thinkingMs: thinking.length > 0 ? thinkingMs : undefined,
|
|
92
|
+
id: makeId(),
|
|
93
|
+
},
|
|
94
|
+
];
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=item-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"item-helpers.js","sourceRoot":"","sources":["../../src/ui/item-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG1D;;;;GAIG;AACH,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,UAAU,cAAc,CAAC,KAAsB;IACnD,IAAI,KAAK,CAAC,MAAM,IAAI,gBAAgB;QAAE,OAAO,KAAK,CAAC;IACnD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,gBAAgB,CAAC;IAC/C,MAAM,SAAS,GAAG,IAAI,KAAK,CAAgB,KAAK,CAAC,MAAM,CAAC,CAAC;IACzD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACpB,SAAS,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;IACjF,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,SAAS,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAA2C;IAChF,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC;IACb,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QACnE,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QACtB,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG;YAAE,GAAG,GAAG,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,GAAG,GAAG,CAAC,CAAC;AACjB,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,YAAY,CAAC,IAAmB;IAC9C,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,YAAY,CAAC;QAClB,KAAK,mBAAmB,CAAC;QACzB,KAAK,QAAQ,CAAC;QACd,KAAK,YAAY;YACf,OAAO,IAAI,CAAC;QACd,KAAK,YAAY;YACf,OAAQ,IAAsB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;QAC3E,KAAK,gBAAgB;YACnB,OAAQ,IAA0B,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;QAChF;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAsB;IAIvD,0EAA0E;IAC1E,2EAA2E;IAC3E,6EAA6E;IAC7E,mCAAmC;IACnC,MAAM,cAAc,GAAG,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACrD,IAAI,cAAc,KAAK,CAAC,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAC3C,CAAC;IACD,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC3C,CAAC;IACD,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC;QACvC,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC;KACvC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;AACvC,CAAC;AACD,SAAS,qBAAqB,CAAC,IAAY;IACzC,OAAO,wDAAwD,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AACpF,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAmB,EAAE,IAAY;IACnE,OAAO,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,kCAAkC,CAAC,EACjD,KAAK,EACL,oBAAoB,EACpB,QAAQ,EACR,UAAU,EACV,MAAM,GAOP;IACC,MAAM,IAAI,GAAG,sBAAsB,CAAC,oBAAoB,CAAC,CAAC;IAC1D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,qBAAqB,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACnE,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC;QAAE,OAAO,KAAK,CAAC;IAClE,OAAO;QACL,GAAG,KAAK;QACR;YACE,IAAI,EAAE,WAAW;YACjB,IAAI;YACJ,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;YACpD,UAAU,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;YACxD,EAAE,EAAE,MAAM,EAAE;SACb;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import type { GoalMode } from "../core/runtime-mode.js";
|
|
2
|
+
import type { FooterStatusLayoutDecision } from "./components/BackgroundTasksBar.js";
|
|
3
|
+
import type { CompletedItem } from "./app-items.js";
|
|
4
|
+
export type OverlayPaneKind = "model" | "goal" | "skills" | "plan" | "theme" | "pixel";
|
|
5
|
+
export declare function shouldHideHistoryForOverlayView(isOverlayView: boolean, _isAgentRunning: boolean): boolean;
|
|
6
|
+
export declare function shouldStabilizeOverlayPaneRerender({ overlayPane, isAgentRunning, }: {
|
|
7
|
+
overlayPane: OverlayPaneKind | null;
|
|
8
|
+
isAgentRunning: boolean;
|
|
9
|
+
}): boolean;
|
|
10
|
+
export declare function shouldHideStaticItemsForOverlayView({ shouldHideHistoryForOverlay, stabilizeOverlayPaneRerender: _stabilizeOverlayPaneRerender, }: {
|
|
11
|
+
shouldHideHistoryForOverlay: boolean;
|
|
12
|
+
stabilizeOverlayPaneRerender: boolean;
|
|
13
|
+
}): boolean;
|
|
14
|
+
export interface DoneFlushDecision {
|
|
15
|
+
showDoneStatus: boolean;
|
|
16
|
+
flushLiveItems: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare function getDoneFlushDecision({ planOverlayPending, goalMode, goalAutoExpand, }: {
|
|
19
|
+
planOverlayPending: boolean;
|
|
20
|
+
goalMode: GoalMode;
|
|
21
|
+
goalAutoExpand: boolean;
|
|
22
|
+
}): DoneFlushDecision;
|
|
23
|
+
export interface GoalSetupPaneTransition {
|
|
24
|
+
overlay: "goal";
|
|
25
|
+
goalAutoExpand: true;
|
|
26
|
+
planAutoExpand: false;
|
|
27
|
+
suppressDoneStatus: true;
|
|
28
|
+
}
|
|
29
|
+
export declare function getGoalSetupFinishedPaneTransition(): GoalSetupPaneTransition;
|
|
30
|
+
export declare function getGoalSetupPaneTransitionAfterRun({ isGoalSetupCommand, setupPanePending, }: {
|
|
31
|
+
isGoalSetupCommand: boolean;
|
|
32
|
+
setupPanePending: boolean;
|
|
33
|
+
}): GoalSetupPaneTransition | null;
|
|
34
|
+
export declare function shouldResetUIForSetupPaneTransition({ hasResetUI, hasSessionStore, }: {
|
|
35
|
+
hasResetUI: boolean;
|
|
36
|
+
hasSessionStore: boolean;
|
|
37
|
+
}): boolean;
|
|
38
|
+
export declare const shouldResetUIForGoalSetupPaneTransition: typeof shouldResetUIForSetupPaneTransition;
|
|
39
|
+
export interface GoalActivationPaneTransition {
|
|
40
|
+
overlay: null;
|
|
41
|
+
goalAutoExpand: false;
|
|
42
|
+
planAutoExpand: false;
|
|
43
|
+
resetReviewScreen: boolean;
|
|
44
|
+
}
|
|
45
|
+
export declare function getGoalActivationPaneTransition(): GoalActivationPaneTransition;
|
|
46
|
+
export interface ScrollStabilizationDecision {
|
|
47
|
+
/** Legacy signal for tests that modeled Static replay avoidance. */
|
|
48
|
+
preserveStatic: boolean;
|
|
49
|
+
/** New output should still appear normally when the user is at the bottom. */
|
|
50
|
+
autoFollow: boolean;
|
|
51
|
+
}
|
|
52
|
+
export interface DoneStatus {
|
|
53
|
+
durationMs: number;
|
|
54
|
+
toolsUsed: string[];
|
|
55
|
+
verb: string;
|
|
56
|
+
}
|
|
57
|
+
export declare function getScrollStabilizationDecision({ isUserScrolled, hasNewOutput, hasTallLiveUserMessage, hasParagraphBreakLiveUserMessage, }: {
|
|
58
|
+
isUserScrolled: boolean;
|
|
59
|
+
hasNewOutput: boolean;
|
|
60
|
+
hasTallLiveUserMessage?: boolean;
|
|
61
|
+
hasParagraphBreakLiveUserMessage?: boolean;
|
|
62
|
+
}): ScrollStabilizationDecision;
|
|
63
|
+
export declare function nextGoalModeAfterAgentDone({ currentMode, runningGoalIds, queuedSyntheticEvents, activeContinuationFlights, wasGoalSetupTurn, }: {
|
|
64
|
+
currentMode: GoalMode;
|
|
65
|
+
runningGoalIds: number;
|
|
66
|
+
queuedSyntheticEvents: number;
|
|
67
|
+
activeContinuationFlights?: number;
|
|
68
|
+
wasGoalSetupTurn?: boolean;
|
|
69
|
+
}): GoalMode;
|
|
70
|
+
export declare function hasParagraphBreakLiveUserMessage(text: string): boolean;
|
|
71
|
+
export declare function isTallLiveUserMessage(text: string, rows: number): boolean;
|
|
72
|
+
export declare function getStaticHistoryKey({ resizeKey }: {
|
|
73
|
+
resizeKey: number;
|
|
74
|
+
}): string;
|
|
75
|
+
export declare const MIN_LIVE_AREA_ROWS = 3;
|
|
76
|
+
export declare function isAgentSpacingItem(item: CompletedItem): boolean;
|
|
77
|
+
export declare function shouldTopSpaceAfterPrintedAgentBoundary({ currentKind, previousLiveItem, lastPendingHistoryItem, lastHistoryItem, }: {
|
|
78
|
+
currentKind: CompletedItem["kind"];
|
|
79
|
+
previousLiveItem?: CompletedItem;
|
|
80
|
+
lastPendingHistoryItem?: CompletedItem;
|
|
81
|
+
lastHistoryItem?: CompletedItem;
|
|
82
|
+
}): boolean;
|
|
83
|
+
export declare function shouldTopSpaceAssistantAfterToolBoundary({ text, previousLiveItem, lastPendingHistoryItem, lastHistoryItem, }: {
|
|
84
|
+
text: string;
|
|
85
|
+
previousLiveItem?: CompletedItem;
|
|
86
|
+
lastPendingHistoryItem?: CompletedItem;
|
|
87
|
+
lastHistoryItem?: CompletedItem;
|
|
88
|
+
}): boolean;
|
|
89
|
+
export declare function shouldTopSpaceStreamingAssistant({ visibleStreamingText, lastLiveItem, lastPendingHistoryItem, lastHistoryItem, }: {
|
|
90
|
+
visibleStreamingText: string;
|
|
91
|
+
lastLiveItem?: CompletedItem;
|
|
92
|
+
lastPendingHistoryItem?: CompletedItem;
|
|
93
|
+
lastHistoryItem?: CompletedItem;
|
|
94
|
+
}): boolean;
|
|
95
|
+
export interface ChatControlsLayoutOptions {
|
|
96
|
+
rows: number;
|
|
97
|
+
columns: number;
|
|
98
|
+
agentRunning: boolean;
|
|
99
|
+
activityVisible: boolean;
|
|
100
|
+
doneStatusVisible: boolean;
|
|
101
|
+
stallStatusVisible: boolean;
|
|
102
|
+
exitPending: boolean;
|
|
103
|
+
footerStatusLayout: FooterStatusLayoutDecision;
|
|
104
|
+
taskBarExpanded: boolean;
|
|
105
|
+
goalStatusEntryCount: number;
|
|
106
|
+
footerFitsOnOneLine: boolean;
|
|
107
|
+
}
|
|
108
|
+
export interface ChatControlsLayoutDecision {
|
|
109
|
+
controlsRows: number;
|
|
110
|
+
liveAreaRows: number;
|
|
111
|
+
}
|
|
112
|
+
export declare function getChatControlsLayoutDecision({ rows, agentRunning, activityVisible, doneStatusVisible, stallStatusVisible, exitPending, footerStatusLayout, taskBarExpanded, goalStatusEntryCount, footerFitsOnOneLine, }: ChatControlsLayoutOptions): ChatControlsLayoutDecision;
|
|
113
|
+
//# sourceMappingURL=layout-decisions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout-decisions.d.ts","sourceRoot":"","sources":["../../src/ui/layout-decisions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
export function shouldHideHistoryForOverlayView(isOverlayView, _isAgentRunning) {
|
|
2
|
+
// Overlay panes are standalone full-screen states. Finalized chat rows are
|
|
3
|
+
// printed outside Ink, so overlays should never replay transcript UI behind them.
|
|
4
|
+
return isOverlayView;
|
|
5
|
+
}
|
|
6
|
+
export function shouldStabilizeOverlayPaneRerender({ overlayPane, isAgentRunning, }) {
|
|
7
|
+
return isAgentRunning && overlayPane === "goal";
|
|
8
|
+
}
|
|
9
|
+
export function shouldHideStaticItemsForOverlayView({ shouldHideHistoryForOverlay, stabilizeOverlayPaneRerender: _stabilizeOverlayPaneRerender, }) {
|
|
10
|
+
return shouldHideHistoryForOverlay;
|
|
11
|
+
}
|
|
12
|
+
export function getDoneFlushDecision({ planOverlayPending, goalMode, goalAutoExpand, }) {
|
|
13
|
+
return {
|
|
14
|
+
showDoneStatus: !(planOverlayPending ||
|
|
15
|
+
goalMode === "planner" ||
|
|
16
|
+
goalMode === "setup" ||
|
|
17
|
+
goalAutoExpand),
|
|
18
|
+
flushLiveItems: true,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export function getGoalSetupFinishedPaneTransition() {
|
|
22
|
+
return {
|
|
23
|
+
overlay: "goal",
|
|
24
|
+
goalAutoExpand: true,
|
|
25
|
+
planAutoExpand: false,
|
|
26
|
+
suppressDoneStatus: true,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export function getGoalSetupPaneTransitionAfterRun({ isGoalSetupCommand, setupPanePending, }) {
|
|
30
|
+
return isGoalSetupCommand && setupPanePending ? getGoalSetupFinishedPaneTransition() : null;
|
|
31
|
+
}
|
|
32
|
+
export function shouldResetUIForSetupPaneTransition({ hasResetUI, hasSessionStore, }) {
|
|
33
|
+
// Opening a review pane is a full-screen state transition. A bare React state
|
|
34
|
+
// flip hides history in the virtual tree, but it does not reset Ink/log-update's
|
|
35
|
+
// already-written terminal frame, so the pane can render below prior chat.
|
|
36
|
+
return hasResetUI && hasSessionStore;
|
|
37
|
+
}
|
|
38
|
+
export const shouldResetUIForGoalSetupPaneTransition = shouldResetUIForSetupPaneTransition;
|
|
39
|
+
export function getGoalActivationPaneTransition() {
|
|
40
|
+
return { overlay: null, goalAutoExpand: false, planAutoExpand: false, resetReviewScreen: true };
|
|
41
|
+
}
|
|
42
|
+
export function getScrollStabilizationDecision({ isUserScrolled, hasNewOutput, hasTallLiveUserMessage = false, hasParagraphBreakLiveUserMessage = false, }) {
|
|
43
|
+
const shouldPreserveStatic = isUserScrolled || hasTallLiveUserMessage || hasParagraphBreakLiveUserMessage;
|
|
44
|
+
const shouldAutoFollow = !(isUserScrolled || hasTallLiveUserMessage);
|
|
45
|
+
return {
|
|
46
|
+
preserveStatic: shouldPreserveStatic && hasNewOutput,
|
|
47
|
+
autoFollow: shouldAutoFollow,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
export function nextGoalModeAfterAgentDone({ currentMode, runningGoalIds, queuedSyntheticEvents, activeContinuationFlights = 0, wasGoalSetupTurn, }) {
|
|
51
|
+
if (wasGoalSetupTurn)
|
|
52
|
+
return "off";
|
|
53
|
+
if (currentMode === "planner" || currentMode === "setup")
|
|
54
|
+
return currentMode;
|
|
55
|
+
if (queuedSyntheticEvents > 0)
|
|
56
|
+
return "coordinator";
|
|
57
|
+
if (activeContinuationFlights > 0)
|
|
58
|
+
return "coordinator";
|
|
59
|
+
if (currentMode === "coordinator" && runningGoalIds > 0)
|
|
60
|
+
return "coordinator";
|
|
61
|
+
return "off";
|
|
62
|
+
}
|
|
63
|
+
export function hasParagraphBreakLiveUserMessage(text) {
|
|
64
|
+
return /\n[ \t]*\n/.test(text);
|
|
65
|
+
}
|
|
66
|
+
export function isTallLiveUserMessage(text, rows) {
|
|
67
|
+
return text.split("\n").length > Math.max(8, Math.floor(rows * 0.6));
|
|
68
|
+
}
|
|
69
|
+
export function getStaticHistoryKey({ resizeKey }) {
|
|
70
|
+
return `${resizeKey}`;
|
|
71
|
+
}
|
|
72
|
+
export const MIN_LIVE_AREA_ROWS = 3;
|
|
73
|
+
const INPUT_AREA_ROWS = 3;
|
|
74
|
+
const STATUS_SLOT_ROWS = 2;
|
|
75
|
+
const FOOTER_ONE_LINE_ROWS = 1;
|
|
76
|
+
const FOOTER_TWO_LINE_ROWS = 2;
|
|
77
|
+
const GOAL_STATUS_ROWS = 1;
|
|
78
|
+
const COLLAPSED_FOOTER_STATUS_ROWS = 1;
|
|
79
|
+
const MAX_EXPANDED_BACKGROUND_TASK_ROWS = 7;
|
|
80
|
+
function isAgentSpacingKind(kind) {
|
|
81
|
+
return [
|
|
82
|
+
"assistant",
|
|
83
|
+
"queued",
|
|
84
|
+
"goal_progress",
|
|
85
|
+
"tool_start",
|
|
86
|
+
"tool_done",
|
|
87
|
+
"tool_group",
|
|
88
|
+
"server_tool_start",
|
|
89
|
+
"server_tool_done",
|
|
90
|
+
"subagent_group",
|
|
91
|
+
"info",
|
|
92
|
+
"error",
|
|
93
|
+
"stopped",
|
|
94
|
+
"plan_transition",
|
|
95
|
+
"goal_agent_transition",
|
|
96
|
+
"model_transition",
|
|
97
|
+
"theme_transition",
|
|
98
|
+
"plan_event",
|
|
99
|
+
"update_notice",
|
|
100
|
+
"compacting",
|
|
101
|
+
"compacted",
|
|
102
|
+
"style_pack",
|
|
103
|
+
"setup_hint",
|
|
104
|
+
].includes(kind);
|
|
105
|
+
}
|
|
106
|
+
function isToolBoundaryKind(kind) {
|
|
107
|
+
return [
|
|
108
|
+
"goal_progress",
|
|
109
|
+
"tool_start",
|
|
110
|
+
"tool_done",
|
|
111
|
+
"tool_group",
|
|
112
|
+
"server_tool_start",
|
|
113
|
+
"server_tool_done",
|
|
114
|
+
"subagent_group",
|
|
115
|
+
].includes(kind);
|
|
116
|
+
}
|
|
117
|
+
export function isAgentSpacingItem(item) {
|
|
118
|
+
return isAgentSpacingKind(item.kind);
|
|
119
|
+
}
|
|
120
|
+
export function shouldTopSpaceAfterPrintedAgentBoundary({ currentKind, previousLiveItem, lastPendingHistoryItem, lastHistoryItem, }) {
|
|
121
|
+
const needsExternalSpacing = isAgentSpacingKind(currentKind);
|
|
122
|
+
if (!needsExternalSpacing)
|
|
123
|
+
return false;
|
|
124
|
+
if (previousLiveItem !== undefined)
|
|
125
|
+
return false;
|
|
126
|
+
const previousKind = lastPendingHistoryItem?.kind ?? lastHistoryItem?.kind;
|
|
127
|
+
return previousKind !== undefined && isAgentSpacingKind(previousKind);
|
|
128
|
+
}
|
|
129
|
+
export function shouldTopSpaceAssistantAfterToolBoundary({ text, previousLiveItem, lastPendingHistoryItem, lastHistoryItem, }) {
|
|
130
|
+
if (text.trim().length === 0)
|
|
131
|
+
return false;
|
|
132
|
+
if (shouldTopSpaceAfterPrintedAgentBoundary({
|
|
133
|
+
currentKind: "assistant",
|
|
134
|
+
previousLiveItem,
|
|
135
|
+
lastPendingHistoryItem,
|
|
136
|
+
lastHistoryItem,
|
|
137
|
+
})) {
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
const previousKind = previousLiveItem?.kind;
|
|
141
|
+
return previousKind !== undefined && isToolBoundaryKind(previousKind);
|
|
142
|
+
}
|
|
143
|
+
export function shouldTopSpaceStreamingAssistant({ visibleStreamingText, lastLiveItem, lastPendingHistoryItem, lastHistoryItem, }) {
|
|
144
|
+
return shouldTopSpaceAssistantAfterToolBoundary({
|
|
145
|
+
text: visibleStreamingText,
|
|
146
|
+
previousLiveItem: lastLiveItem,
|
|
147
|
+
lastPendingHistoryItem,
|
|
148
|
+
lastHistoryItem,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
export function getChatControlsLayoutDecision({ rows, agentRunning, activityVisible, doneStatusVisible, stallStatusVisible, exitPending, footerStatusLayout, taskBarExpanded, goalStatusEntryCount, footerFitsOnOneLine, }) {
|
|
152
|
+
const statusRows = activityVisible || stallStatusVisible || doneStatusVisible || agentRunning
|
|
153
|
+
? STATUS_SLOT_ROWS
|
|
154
|
+
: 0;
|
|
155
|
+
const footerRows = exitPending || footerFitsOnOneLine ? FOOTER_ONE_LINE_ROWS : FOOTER_TWO_LINE_ROWS;
|
|
156
|
+
const goalRows = !exitPending && goalStatusEntryCount > 0 ? GOAL_STATUS_ROWS : 0;
|
|
157
|
+
const footerStatusRows = footerStatusLayout.stack
|
|
158
|
+
? Number(footerStatusLayout.hasBackgroundTasks) + Number(footerStatusLayout.hasUpdateNotice)
|
|
159
|
+
: footerStatusLayout.hasBackgroundTasks || footerStatusLayout.hasUpdateNotice
|
|
160
|
+
? COLLAPSED_FOOTER_STATUS_ROWS
|
|
161
|
+
: 0;
|
|
162
|
+
const expandedTaskRows = taskBarExpanded && footerStatusLayout.hasBackgroundTasks
|
|
163
|
+
? MAX_EXPANDED_BACKGROUND_TASK_ROWS - COLLAPSED_FOOTER_STATUS_ROWS
|
|
164
|
+
: 0;
|
|
165
|
+
const controlsRows = statusRows + INPUT_AREA_ROWS + footerRows + goalRows + footerStatusRows + expandedTaskRows;
|
|
166
|
+
const maxControlsRows = Math.max(1, rows - MIN_LIVE_AREA_ROWS);
|
|
167
|
+
const boundedControlsRows = Math.min(controlsRows, maxControlsRows);
|
|
168
|
+
return {
|
|
169
|
+
controlsRows: boundedControlsRows,
|
|
170
|
+
liveAreaRows: Math.max(MIN_LIVE_AREA_ROWS, rows - boundedControlsRows),
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=layout-decisions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout-decisions.js","sourceRoot":"","sources":["../../src/ui/layout-decisions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Message, TextContent, ImageContent } from "@kenkaiiii/gg-ai";
|
|
2
|
+
import type { ImageAttachment } from "../utils/image.js";
|
|
3
|
+
import type { CustomCommand } from "../core/custom-commands.js";
|
|
4
|
+
import type { GoalMode } from "../core/runtime-mode.js";
|
|
5
|
+
import type { UserContent } from "./hooks/useAgentLoop.js";
|
|
6
|
+
export declare function routePromptCommandInput(input: string, promptCommands?: import("../core/prompt-commands.js").PromptCommand[], customCommands?: Pick<CustomCommand, "name" | "prompt">[]): {
|
|
7
|
+
cmdName: string;
|
|
8
|
+
cmdArgs: string;
|
|
9
|
+
promptText: string;
|
|
10
|
+
fullPrompt: string;
|
|
11
|
+
} | null;
|
|
12
|
+
export declare function collectAssistantTextSince(messages: readonly Message[], startIndex: number, maxChars?: number): string;
|
|
13
|
+
export declare function buildGoalSetupPromptFromPlanner({ originalGoalPrompt, plannerOutput, }: {
|
|
14
|
+
originalGoalPrompt: string;
|
|
15
|
+
plannerOutput: string;
|
|
16
|
+
}): string;
|
|
17
|
+
export declare function isGoalPromptCommandName(cmdName: string): boolean;
|
|
18
|
+
export declare function runGoalPromptSetupSequence({ userContent, fullPrompt, messagesRef, setGoalModeAndPrompt, runAgent, onStage, }: {
|
|
19
|
+
userContent: UserContent;
|
|
20
|
+
fullPrompt: string;
|
|
21
|
+
messagesRef: {
|
|
22
|
+
current: Message[];
|
|
23
|
+
};
|
|
24
|
+
setGoalModeAndPrompt: (nextMode: GoalMode) => Promise<void>;
|
|
25
|
+
runAgent: (content: UserContent) => Promise<void>;
|
|
26
|
+
onStage?: (text: string) => void;
|
|
27
|
+
}): Promise<void>;
|
|
28
|
+
export declare function buildUserContentWithAttachments(text: string, inputImages: ImageAttachment[], modelSupportsImages: boolean): string | (TextContent | ImageContent)[];
|
|
29
|
+
//# sourceMappingURL=prompt-routing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-routing.d.ts","sourceRoot":"","sources":["../../src/ui/prompt-routing.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,MAAM,EACb,cAAc,uDAAkB,EAChC,cAAc,GAAE,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,QAAQ,CAAC,EAAO,GAC5D;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAgBrF;AAYD,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,SAAS,OAAO,EAAE,EAC5B,UAAU,EAAE,MAAM,EAClB,QAAQ,SAAgC,GACvC,MAAM,CASR;AAED,wBAAgB,+BAA+B,CAAC,EAC9C,kBAAkB,EAClB,aAAa,GACd,EAAE;IACD,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,MAAM,CAQT;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED,wBAAsB,0BAA0B,CAAC,EAC/C,WAAW,EACX,UAAU,EACV,WAAW,EACX,oBAAoB,EACpB,QAAQ,EACR,OAAO,GACR,EAAE;IACD,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE;QAAE,OAAO,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC;IACpC,oBAAoB,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,QAAQ,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC,GAAG,OAAO,CAAC,IAAI,CAAC,CAahB;AAED,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,eAAe,EAAE,EAC9B,mBAAmB,EAAE,OAAO,GAC3B,MAAM,GAAG,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,CAqCzC"}
|