santree 0.5.5 → 0.5.6
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.
|
@@ -629,21 +629,21 @@ export default function Dashboard() {
|
|
|
629
629
|
}
|
|
630
630
|
}, [state.reviewSelectedIndex, state.flatReviews, contentHeight, state.reviewListScrollOffset]);
|
|
631
631
|
// ── Mouse tracking pause ─────────────────────────────────────────
|
|
632
|
-
//
|
|
633
|
-
//
|
|
634
|
-
//
|
|
635
|
-
//
|
|
636
|
-
// review); restore when that phase ends.
|
|
632
|
+
// With SGR mouse tracking on, every click emits `\x1b[<btn;col;rowM` —
|
|
633
|
+
// these escape sequences leak into text inputs as garbage characters
|
|
634
|
+
// (and into MultilineTextArea, the leading ESC fires key.escape).
|
|
635
|
+
// Disable tracking while any text-input overlay is mounted; restore on exit.
|
|
637
636
|
useEffect(() => {
|
|
638
|
-
const needsMouseOff =
|
|
639
|
-
(state.overlay === "pr-create" && state.prCreatePhase === "review")
|
|
637
|
+
const needsMouseOff = state.overlay === "context-input" ||
|
|
638
|
+
(state.overlay === "pr-create" && state.prCreatePhase === "review") ||
|
|
639
|
+
(state.overlay === "commit" && state.commitPhase === "awaiting-message");
|
|
640
640
|
if (!needsMouseOff)
|
|
641
641
|
return;
|
|
642
642
|
process.stdout.write("\x1b[?1002l\x1b[?1006l");
|
|
643
643
|
return () => {
|
|
644
644
|
process.stdout.write("\x1b[?1002h\x1b[?1006h");
|
|
645
645
|
};
|
|
646
|
-
}, [state.overlay, state.
|
|
646
|
+
}, [state.overlay, state.prCreatePhase, state.commitPhase]);
|
|
647
647
|
// ── Diff overlay: load file list when opened ──────────────────────
|
|
648
648
|
// Resolves merge-base against the configured base branch so upstream-only
|
|
649
649
|
// changes (commits on master we haven't pulled) are excluded — same semantics
|
|
@@ -1396,29 +1396,10 @@ export default function Dashboard() {
|
|
|
1396
1396
|
}
|
|
1397
1397
|
return;
|
|
1398
1398
|
}
|
|
1399
|
-
// Context-input overlay
|
|
1400
|
-
//
|
|
1401
|
-
//
|
|
1402
|
-
// Review phase: outer handles y/n/e/ESC.
|
|
1399
|
+
// Context-input overlay: MultilineTextArea owns useInput (outer is
|
|
1400
|
+
// disabled via isActive below). Submit launches directly; cancel
|
|
1401
|
+
// closes the overlay.
|
|
1403
1402
|
if (state.overlay === "context-input") {
|
|
1404
|
-
if (state.contextInputPhase === "review") {
|
|
1405
|
-
if (input === "y" || key.return) {
|
|
1406
|
-
const mode = state.contextInputMode;
|
|
1407
|
-
const ctx = state.contextInputValue;
|
|
1408
|
-
dispatch({ type: "CONTEXT_INPUT_DONE" });
|
|
1409
|
-
if (mode)
|
|
1410
|
-
doWork(mode, ctx);
|
|
1411
|
-
return;
|
|
1412
|
-
}
|
|
1413
|
-
if (input === "n" || input === "e") {
|
|
1414
|
-
dispatch({ type: "CONTEXT_INPUT_EDIT" });
|
|
1415
|
-
return;
|
|
1416
|
-
}
|
|
1417
|
-
if (key.escape) {
|
|
1418
|
-
dispatch({ type: "CONTEXT_INPUT_DONE" });
|
|
1419
|
-
return;
|
|
1420
|
-
}
|
|
1421
|
-
}
|
|
1422
1403
|
return;
|
|
1423
1404
|
}
|
|
1424
1405
|
// Diff overlay
|
|
@@ -2107,7 +2088,7 @@ export default function Dashboard() {
|
|
|
2107
2088
|
return;
|
|
2108
2089
|
}
|
|
2109
2090
|
}, {
|
|
2110
|
-
isActive:
|
|
2091
|
+
isActive: state.overlay !== "context-input" &&
|
|
2111
2092
|
(state.overlay !== "pr-create" || state.prCreatePhase !== "review") &&
|
|
2112
2093
|
(state.overlay !== "commit" || state.commitPhase !== "awaiting-message"),
|
|
2113
2094
|
});
|
|
@@ -2120,10 +2101,13 @@ export default function Dashboard() {
|
|
|
2120
2101
|
}
|
|
2121
2102
|
const selectedIssue = state.flatIssues[state.selectedIndex] ?? null;
|
|
2122
2103
|
const selectedReview = state.flatReviews[state.reviewSelectedIndex] ?? null;
|
|
2123
|
-
return (_jsxs(Box, { width: columns, height: rows, flexDirection: "column", children: [_jsxs(Box, { paddingX: 1, children: [_jsx(Text, { bold: true, color: "cyan", children: "santree" }), _jsxs(Text, { dimColor: true, children: [" ", "v", version] }), updateAvailable && latestVersion ? (_jsxs(Text, { color: "yellow", children: [" ⬆ v", latestVersion, " available — `santree update`"] })) : null, CLAUDE_VERSION ? (_jsxs(Text, { dimColor: true, children: [" · claude ", CLAUDE_VERSION] })) : null, claudeUpdateAvailable && latestClaudeVersion ? (_jsxs(Text, { color: "yellow", children: [" ⬆ ", latestClaudeVersion] })) : null, state.refreshing ? _jsx(Text, { dimColor: true, children: " · refreshing…" }) : null, state.actionMessage ? (_jsxs(Text, { color: "yellow", children: [" · ", state.actionMessage] })) : null] }), _jsxs(Box, { paddingX: 1, children: [_jsx(Tab, { active: state.activeTab === "issues", label: `1 Issues (${state.flatIssues.length})`, mode: theme.mode }), _jsx(Text, { children: " " }), _jsx(Tab, { active: state.activeTab === "reviews", label: `2 Reviews (${state.flatReviews.length})`, mode: theme.mode })] }), _jsxs(Box, { flexGrow: 1, borderStyle: "round", borderColor: "cyan", flexDirection: "column", children: [state.overlay === "mode-select" ? (_jsx(Box, { flexGrow: 1, justifyContent: "center", alignItems: "center", children: _jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 3, paddingY: 1, children: [_jsx(Text, { bold: true, children: "Select mode:" }), _jsx(Text, { children: " " }), _jsxs(Text, { children: [_jsx(Text, { color: "cyan", bold: true, children: "p" }), " Plan"] }), _jsxs(Text, { children: [_jsx(Text, { color: "cyan", bold: true, children: "i" }), " Implement"] }), _jsx(Text, { children: " " }), _jsx(Text, { dimColor: true, children: "ESC to cancel" })] }) })) : state.overlay === "context-input" ? (_jsx(Box, { flexGrow: 1, justifyContent: "center", alignItems: "center", children: _jsxs(Box, { flexDirection: "column", paddingX: 2, width: Math.min(columns - 8, 100), children: [_jsxs(Text, { bold: true, color: "cyan", children: ["Extra context for ", state.contextInputMode] }), _jsx(Text, { dimColor: true, children: "Optional \u2014 appended to the prompt before launching Claude" }), _jsx(Text, { children: " " }),
|
|
2124
|
-
|
|
2125
|
-
|
|
2126
|
-
|
|
2104
|
+
return (_jsxs(Box, { width: columns, height: rows, flexDirection: "column", children: [_jsxs(Box, { paddingX: 1, children: [_jsx(Text, { bold: true, color: "cyan", children: "santree" }), _jsxs(Text, { dimColor: true, children: [" ", "v", version] }), updateAvailable && latestVersion ? (_jsxs(Text, { color: "yellow", children: [" ⬆ v", latestVersion, " available — `santree update`"] })) : null, CLAUDE_VERSION ? (_jsxs(Text, { dimColor: true, children: [" · claude ", CLAUDE_VERSION] })) : null, claudeUpdateAvailable && latestClaudeVersion ? (_jsxs(Text, { color: "yellow", children: [" ⬆ ", latestClaudeVersion] })) : null, state.refreshing ? _jsx(Text, { dimColor: true, children: " · refreshing…" }) : null, state.actionMessage ? (_jsxs(Text, { color: "yellow", children: [" · ", state.actionMessage] })) : null] }), _jsxs(Box, { paddingX: 1, children: [_jsx(Tab, { active: state.activeTab === "issues", label: `1 Issues (${state.flatIssues.length})`, mode: theme.mode }), _jsx(Text, { children: " " }), _jsx(Tab, { active: state.activeTab === "reviews", label: `2 Reviews (${state.flatReviews.length})`, mode: theme.mode })] }), _jsxs(Box, { flexGrow: 1, borderStyle: "round", borderColor: "cyan", flexDirection: "column", children: [state.overlay === "mode-select" ? (_jsx(Box, { flexGrow: 1, justifyContent: "center", alignItems: "center", children: _jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 3, paddingY: 1, children: [_jsx(Text, { bold: true, children: "Select mode:" }), _jsx(Text, { children: " " }), _jsxs(Text, { children: [_jsx(Text, { color: "cyan", bold: true, children: "p" }), " Plan"] }), _jsxs(Text, { children: [_jsx(Text, { color: "cyan", bold: true, children: "i" }), " Implement"] }), _jsx(Text, { children: " " }), _jsx(Text, { dimColor: true, children: "ESC to cancel" })] }) })) : state.overlay === "context-input" ? (_jsx(Box, { flexGrow: 1, justifyContent: "center", alignItems: "center", children: _jsxs(Box, { flexDirection: "column", paddingX: 2, width: Math.min(columns - 8, 100), children: [_jsxs(Text, { bold: true, color: "cyan", children: ["Extra context for ", state.contextInputMode] }), _jsx(Text, { dimColor: true, children: "Optional \u2014 appended to the prompt before launching Claude" }), _jsx(Text, { children: " " }), _jsx(MultilineTextArea, { value: state.contextInputValue, onChange: (v) => dispatch({ type: "CONTEXT_INPUT_CHANGE", value: v }), onSubmit: () => {
|
|
2105
|
+
const mode = state.contextInputMode;
|
|
2106
|
+
const ctx = state.contextInputValue;
|
|
2107
|
+
dispatch({ type: "CONTEXT_INPUT_DONE" });
|
|
2108
|
+
if (mode)
|
|
2109
|
+
doWork(mode, ctx);
|
|
2110
|
+
}, onCancel: () => dispatch({ type: "CONTEXT_INPUT_DONE" }), width: Math.min(columns - 8, 100), height: 10, placeholder: "Type or paste extra context\u2026" }), _jsx(Text, { children: " " }), _jsxs(Text, { dimColor: true, children: [_jsx(Text, { color: "cyan", bold: true, children: "Ctrl+D" }), " launch · ", _jsx(Text, { color: "cyan", bold: true, children: "Ctrl+O" }), " editor · ", _jsx(Text, { color: "cyan", bold: true, children: "Ctrl+G" }), " cancel"] })] }) })) : state.overlay === "base-select" ? (_jsx(Box, { flexGrow: 1, justifyContent: "center", alignItems: "center", children: _jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 3, paddingY: 1, children: [_jsx(Text, { bold: true, children: "Select base branch:" }), _jsx(Text, { children: " " }), state.baseSelectOptions.map((branch, idx) => {
|
|
2127
2111
|
const selected = idx === state.baseSelectIndex;
|
|
2128
2112
|
const defaultBranch = getDefaultBranch();
|
|
2129
2113
|
const label = branch === defaultBranch ? `${branch} (default)` : branch;
|
|
@@ -162,24 +162,17 @@ export function MultilineTextArea({ value, onChange, onSubmit, onCancel, placeho
|
|
|
162
162
|
onSubmit();
|
|
163
163
|
return;
|
|
164
164
|
}
|
|
165
|
-
// Ctrl+C: cancel (preferred over Esc — vim users rely on Esc muscle memory)
|
|
166
|
-
if (key.ctrl && input === "c") {
|
|
167
|
-
onCancel();
|
|
168
|
-
return;
|
|
169
|
-
}
|
|
170
165
|
// Ctrl+O: escalate to $SANTREE_EDITOR / $VISUAL / $EDITOR. On save+close
|
|
171
|
-
// the buffer is replaced and
|
|
166
|
+
// the buffer is replaced and control returns to the textbox so the
|
|
167
|
+
// user can keep editing or submit with Ctrl+D.
|
|
172
168
|
if (key.ctrl && input === "o") {
|
|
173
169
|
const result = editExternally(value, "md");
|
|
174
170
|
if (!result.ok)
|
|
175
171
|
return;
|
|
176
|
-
if (result.cancelled)
|
|
177
|
-
onCancel();
|
|
172
|
+
if (result.cancelled)
|
|
178
173
|
return;
|
|
179
|
-
}
|
|
180
174
|
onChange(result.content);
|
|
181
175
|
setCursor(result.content.length);
|
|
182
|
-
onSubmit();
|
|
183
176
|
return;
|
|
184
177
|
}
|
|
185
178
|
// Ctrl+V: paste clipboard image as a temp file reference.
|
|
@@ -189,6 +182,13 @@ export function MultilineTextArea({ value, onChange, onSubmit, onCancel, placeho
|
|
|
189
182
|
insertAt(cursor, ``);
|
|
190
183
|
return;
|
|
191
184
|
}
|
|
185
|
+
// Ctrl+G: cancel (Emacs abort). Ctrl+C can't be used because Ink's
|
|
186
|
+
// exitOnCtrlC fires at the app level before useInput sees it, exiting
|
|
187
|
+
// the dashboard. Esc is reserved for vim muscle memory (swallowed).
|
|
188
|
+
if (key.ctrl && input === "g") {
|
|
189
|
+
onCancel();
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
192
|
// Esc: swallow without cancelling (vim users hit it constantly).
|
|
193
193
|
if (key.escape)
|
|
194
194
|
return;
|
|
@@ -22,7 +22,7 @@ export function CommitOverlay({ width, height, branch, ticketId, gitStatus, phas
|
|
|
22
22
|
}), gitStatus.split("\n").length > 8 && (_jsxs(Text, { dimColor: true, children: [" +", gitStatus.split("\n").length - 8, " more"] }))] })) : null, _jsx(Text, { children: " " }), phase === "confirm-stage" && (_jsxs(Text, { children: ["Stage all changes?", " ", _jsx(Text, { color: "cyan", bold: true, children: "y" }), "/", _jsx(Text, { color: "cyan", bold: true, children: "n" })] })), phase === "awaiting-message" && (_jsxs(Box, { children: [_jsx(Text, { children: "Message: " }), _jsx(TextInput, { value: message, onChange: (v) => dispatch({ type: "COMMIT_MESSAGE", message: v }), onSubmit: onSubmit })] })), phase === "committing" && (_jsxs(Text, { children: [_jsx(Text, { color: "cyan", children: _jsx(Spinner, { type: "dots" }) }), " ", "Committing..."] })), phase === "pushing" && (_jsxs(Text, { children: [_jsx(Text, { color: "cyan", children: _jsx(Spinner, { type: "dots" }) }), " ", "Pushing..."] })), phase === "done" && (_jsx(Text, { color: "green", bold: true, children: "Committed and pushed!" })), phase === "error" && _jsx(Text, { color: "red", children: error }), _jsx(Text, { children: " " }), _jsx(Text, { dimColor: true, children: "ESC to cancel" })] }));
|
|
23
23
|
}
|
|
24
24
|
export function PrCreateOverlay({ width, height, branch, ticketId, phase, error, url, body, title, dispatch, }) {
|
|
25
|
-
return (_jsxs(Box, { flexDirection: "column", width: width, height: height, children: [_jsx(Text, { bold: true, color: "cyan", children: "Create Pull Request" }), _jsx(Text, { dimColor: true, children: "─".repeat(Math.min(width, 50)) }), _jsxs(Text, { children: [_jsx(Text, { dimColor: true, children: "branch: " }), _jsx(Text, { children: branch })] }), _jsxs(Text, { children: [_jsx(Text, { dimColor: true, children: "ticket: " }), _jsx(Text, { children: ticketId })] }), _jsx(Text, { children: " " }), phase === "choose-mode" && (_jsxs(_Fragment, { children: [_jsx(Text, { bold: true, children: "How do you want to create this PR?" }), _jsx(Text, { children: " " }), _jsxs(Text, { children: [" ", _jsx(Text, { color: "cyan", bold: true, children: "f" }), " ", "Fill \u2014 use AI to fill the PR template"] }), _jsxs(Text, { children: [" ", _jsx(Text, { color: "cyan", bold: true, children: "w" }), " ", "Web \u2014 open in browser to edit manually"] })] })), phase === "pushing" && (_jsxs(Text, { children: [_jsx(Text, { color: "cyan", children: _jsx(Spinner, { type: "dots" }) }), " ", "Pushing branch..."] })), phase === "filling" && (_jsxs(Text, { children: [_jsx(Text, { color: "cyan", children: _jsx(Spinner, { type: "dots" }) }), " ", "Filling PR template with AI..."] })), phase === "review" && (_jsxs(_Fragment, { children: [_jsx(Text, { bold: true, children: "Edit PR description" }), _jsx(Text, { children: " " }), _jsxs(Text, { children: [_jsx(Text, { dimColor: true, children: "title: " }), _jsx(Text, { children: title })] }), _jsx(Text, { children: " " }), _jsx(MultilineTextArea, { value: body ?? "", onChange: (v) => dispatch({ type: "PR_CREATE_BODY_CHANGE", body: v }), onSubmit: () => dispatch({ type: "PR_CREATE_CONFIRM" }), onCancel: () => dispatch({ type: "PR_CREATE_CANCEL" }), width: width, height: Math.max(6, height - 10), placeholder: "(empty PR body)" }), _jsx(Text, { children: " " }), _jsxs(Text, { dimColor: true, children: [_jsx(Text, { color: "cyan", bold: true, children: "Ctrl+D" }), " send · ", _jsx(Text, { color: "cyan", bold: true, children: "Ctrl+O" }), " editor · ", _jsx(Text, { color: "cyan", bold: true, children: "Ctrl+
|
|
25
|
+
return (_jsxs(Box, { flexDirection: "column", width: width, height: height, children: [_jsx(Text, { bold: true, color: "cyan", children: "Create Pull Request" }), _jsx(Text, { dimColor: true, children: "─".repeat(Math.min(width, 50)) }), _jsxs(Text, { children: [_jsx(Text, { dimColor: true, children: "branch: " }), _jsx(Text, { children: branch })] }), _jsxs(Text, { children: [_jsx(Text, { dimColor: true, children: "ticket: " }), _jsx(Text, { children: ticketId })] }), _jsx(Text, { children: " " }), phase === "choose-mode" && (_jsxs(_Fragment, { children: [_jsx(Text, { bold: true, children: "How do you want to create this PR?" }), _jsx(Text, { children: " " }), _jsxs(Text, { children: [" ", _jsx(Text, { color: "cyan", bold: true, children: "f" }), " ", "Fill \u2014 use AI to fill the PR template"] }), _jsxs(Text, { children: [" ", _jsx(Text, { color: "cyan", bold: true, children: "w" }), " ", "Web \u2014 open in browser to edit manually"] })] })), phase === "pushing" && (_jsxs(Text, { children: [_jsx(Text, { color: "cyan", children: _jsx(Spinner, { type: "dots" }) }), " ", "Pushing branch..."] })), phase === "filling" && (_jsxs(Text, { children: [_jsx(Text, { color: "cyan", children: _jsx(Spinner, { type: "dots" }) }), " ", "Filling PR template with AI..."] })), phase === "review" && (_jsxs(_Fragment, { children: [_jsx(Text, { bold: true, children: "Edit PR description" }), _jsx(Text, { children: " " }), _jsxs(Text, { children: [_jsx(Text, { dimColor: true, children: "title: " }), _jsx(Text, { children: title })] }), _jsx(Text, { children: " " }), _jsx(MultilineTextArea, { value: body ?? "", onChange: (v) => dispatch({ type: "PR_CREATE_BODY_CHANGE", body: v }), onSubmit: () => dispatch({ type: "PR_CREATE_CONFIRM" }), onCancel: () => dispatch({ type: "PR_CREATE_CANCEL" }), width: width, height: Math.max(6, height - 10), placeholder: "(empty PR body)" }), _jsx(Text, { children: " " }), _jsxs(Text, { dimColor: true, children: [_jsx(Text, { color: "cyan", bold: true, children: "Ctrl+D" }), " send · ", _jsx(Text, { color: "cyan", bold: true, children: "Ctrl+O" }), " editor · ", _jsx(Text, { color: "cyan", bold: true, children: "Ctrl+G" }), " cancel"] })] })), phase === "confirm" && (_jsxs(_Fragment, { children: [_jsx(Text, { bold: true, children: "Create this PR?" }), _jsx(Text, { children: " " }), _jsxs(Text, { children: [_jsx(Text, { dimColor: true, children: "title: " }), _jsx(Text, { children: title })] }), _jsx(Text, { children: " " }), _jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "green", paddingX: 1, children: [(body ?? "")
|
|
26
26
|
.split("\n")
|
|
27
27
|
.slice(0, Math.max(4, height - 12))
|
|
28
28
|
.map((line, i) => (_jsx(Text, { wrap: "truncate", children: line || " " }, i))), (body ?? "").split("\n").length > Math.max(4, height - 12) && (_jsxs(Text, { dimColor: true, children: ["\u2026+", (body ?? "").split("\n").length - Math.max(4, height - 12), " more lines"] }))] }), _jsx(Text, { children: " " }), _jsxs(Text, { children: [_jsx(Text, { color: "green", bold: true, children: "y" }), " / ", _jsx(Text, { color: "green", bold: true, children: "Enter" }), " create ", _jsx(Text, { color: "yellow", bold: true, children: "e" }), " keep editing ", _jsx(Text, { color: "cyan", bold: true, children: "w" }), " open in browser ", _jsx(Text, { color: "red", bold: true, children: "ESC" }), " cancel"] })] })), phase === "creating" && (_jsxs(Text, { children: [_jsx(Text, { color: "cyan", children: _jsx(Spinner, { type: "dots" }) }), " ", "Creating PR..."] })), phase === "done" && (_jsxs(_Fragment, { children: [_jsx(Text, { color: "green", bold: true, children: "PR created!" }), url ? _jsx(Text, { dimColor: true, children: url }) : null] })), phase === "error" && (_jsxs(_Fragment, { children: [_jsx(Text, { color: "red", children: error }), _jsx(Text, { children: " " }), _jsxs(Text, { dimColor: true, children: [_jsx(Text, { color: "cyan", bold: true, children: "w" }), " ", "open in browser ESC cancel"] })] })), phase !== "review" && phase !== "confirm" && phase !== "error" && (_jsxs(_Fragment, { children: [_jsx(Text, { children: " " }), _jsx(Text, { dimColor: true, children: "ESC to cancel" })] }))] }));
|
|
@@ -103,7 +103,6 @@ export interface DashboardState {
|
|
|
103
103
|
baseSelectChosen: string | null;
|
|
104
104
|
contextInputValue: string;
|
|
105
105
|
contextInputMode: "plan" | "implement" | null;
|
|
106
|
-
contextInputPhase: "editing" | "review";
|
|
107
106
|
diffTicketId: string | null;
|
|
108
107
|
diffWorktreePath: string | null;
|
|
109
108
|
diffBaseBranch: string | null;
|
|
@@ -249,10 +248,6 @@ export type DashboardAction = {
|
|
|
249
248
|
} | {
|
|
250
249
|
type: "CONTEXT_INPUT_CHANGE";
|
|
251
250
|
value: string;
|
|
252
|
-
} | {
|
|
253
|
-
type: "CONTEXT_INPUT_REVIEW";
|
|
254
|
-
} | {
|
|
255
|
-
type: "CONTEXT_INPUT_EDIT";
|
|
256
251
|
} | {
|
|
257
252
|
type: "CONTEXT_INPUT_DONE";
|
|
258
253
|
} | {
|
|
@@ -40,7 +40,6 @@ export const initialState = {
|
|
|
40
40
|
baseSelectChosen: null,
|
|
41
41
|
contextInputValue: "",
|
|
42
42
|
contextInputMode: null,
|
|
43
|
-
contextInputPhase: "editing",
|
|
44
43
|
diffTicketId: null,
|
|
45
44
|
diffWorktreePath: null,
|
|
46
45
|
diffBaseBranch: null,
|
|
@@ -271,21 +270,15 @@ export function reducer(state, action) {
|
|
|
271
270
|
overlay: "context-input",
|
|
272
271
|
contextInputMode: action.mode,
|
|
273
272
|
contextInputValue: "",
|
|
274
|
-
contextInputPhase: "editing",
|
|
275
273
|
};
|
|
276
274
|
case "CONTEXT_INPUT_CHANGE":
|
|
277
275
|
return { ...state, contextInputValue: action.value };
|
|
278
|
-
case "CONTEXT_INPUT_REVIEW":
|
|
279
|
-
return { ...state, contextInputPhase: "review" };
|
|
280
|
-
case "CONTEXT_INPUT_EDIT":
|
|
281
|
-
return { ...state, contextInputPhase: "editing" };
|
|
282
276
|
case "CONTEXT_INPUT_DONE":
|
|
283
277
|
return {
|
|
284
278
|
...state,
|
|
285
279
|
overlay: null,
|
|
286
280
|
contextInputMode: null,
|
|
287
281
|
contextInputValue: "",
|
|
288
|
-
contextInputPhase: "editing",
|
|
289
282
|
};
|
|
290
283
|
case "DIFF_OPEN":
|
|
291
284
|
return {
|