@stigmer/ink 3.1.3 → 3.1.5
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/components/ApprovalPrompt.d.ts +15 -1
- package/components/ApprovalPrompt.d.ts.map +1 -1
- package/components/ApprovalPrompt.js +9 -3
- package/components/ApprovalPrompt.js.map +1 -1
- package/components/FileChangeProgressBar.d.ts.map +1 -1
- package/components/FileChangeProgressBar.js +3 -18
- package/components/FileChangeProgressBar.js.map +1 -1
- package/components/FileDiffBody.d.ts +30 -0
- package/components/FileDiffBody.d.ts.map +1 -0
- package/components/FileDiffBody.js +106 -0
- package/components/FileDiffBody.js.map +1 -0
- package/components/FileReviewAtoms.d.ts +23 -0
- package/components/FileReviewAtoms.d.ts.map +1 -0
- package/components/FileReviewAtoms.js +26 -0
- package/components/FileReviewAtoms.js.map +1 -0
- package/components/FileReviewPrompt.d.ts.map +1 -1
- package/components/FileReviewPrompt.js +16 -5
- package/components/FileReviewPrompt.js.map +1 -1
- package/components/FileReviewRecord.d.ts.map +1 -1
- package/components/FileReviewRecord.js +5 -3
- package/components/FileReviewRecord.js.map +1 -1
- package/components/MessageThread.d.ts.map +1 -1
- package/components/MessageThread.js +11 -3
- package/components/MessageThread.js.map +1 -1
- package/file-review.d.ts +17 -0
- package/file-review.d.ts.map +1 -1
- package/file-review.js +18 -0
- package/file-review.js.map +1 -1
- package/index.d.ts +3 -1
- package/index.d.ts.map +1 -1
- package/index.js +3 -1
- package/index.js.map +1 -1
- package/package.json +4 -4
- package/src/__tests__/components.test.tsx +65 -0
- package/src/__tests__/data-pickers.test.tsx +1 -6
- package/src/__tests__/file-review.test.tsx +318 -3
- package/src/__tests__/test-support.tsx +25 -0
- package/src/components/ApprovalPrompt.tsx +33 -11
- package/src/components/FileChangeProgressBar.tsx +3 -29
- package/src/components/FileDiffBody.tsx +164 -0
- package/src/components/FileReviewAtoms.tsx +37 -0
- package/src/components/FileReviewPrompt.tsx +34 -2
- package/src/components/FileReviewRecord.tsx +11 -0
- package/src/components/MessageThread.tsx +15 -2
- package/src/file-review.ts +27 -0
- package/src/index.ts +4 -0
|
@@ -8,6 +8,20 @@ export interface ApprovalPromptProps {
|
|
|
8
8
|
readonly onSubmit: (action: ApprovalAction) => void;
|
|
9
9
|
/** Disables input while an approval submission is in flight. */
|
|
10
10
|
readonly isSubmitting?: boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Whether this prompt owns the keyboard. Defaults to `true`. When `false` the
|
|
13
|
+
* prompt renders inert (no `useInput`, no selection cursor, options dimmed) so
|
|
14
|
+
* exactly one decision surface is interactive at a time.
|
|
15
|
+
*
|
|
16
|
+
* This is the terminal's single-active-decision-surface rule: stdin is
|
|
17
|
+
* delivered to *every* mounted `useInput`, so several live `ApprovalPrompt`s
|
|
18
|
+
* would each consume the same keystroke and settle at once. The caller
|
|
19
|
+
* ({@link MessageThread}) marks only the first pending approval active; the
|
|
20
|
+
* file-review prompt in turn yields to any pending approval
|
|
21
|
+
* (`FileReviewPrompt.isActive = pendingApprovals.length === 0` in `SessionView`),
|
|
22
|
+
* so the order is: first approval → else the file-review prompt.
|
|
23
|
+
*/
|
|
24
|
+
readonly isActive?: boolean;
|
|
11
25
|
}
|
|
12
26
|
/**
|
|
13
27
|
* HITL approval prompt for tool call authorization.
|
|
@@ -20,5 +34,5 @@ export interface ApprovalPromptProps {
|
|
|
20
34
|
* file edit / delete / shell category) — other classes keep prompting. The
|
|
21
35
|
* option label names that class so the scope is never a surprise.
|
|
22
36
|
*/
|
|
23
|
-
export declare function ApprovalPrompt({ pendingApproval, onSubmit, isSubmitting, }: ApprovalPromptProps): import("react/jsx-runtime").JSX.Element;
|
|
37
|
+
export declare function ApprovalPrompt({ pendingApproval, onSubmit, isSubmitting, isActive, }: ApprovalPromptProps): import("react/jsx-runtime").JSX.Element;
|
|
24
38
|
//# sourceMappingURL=ApprovalPrompt.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApprovalPrompt.d.ts","sourceRoot":"","sources":["../../src/components/ApprovalPrompt.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kEAAkE,CAAC;AACxG,OAAO,EAAE,cAAc,EAAE,MAAM,8DAA8D,CAAC;AAO9F,wCAAwC;AACxC,MAAM,WAAW,mBAAmB;IAClC,8CAA8C;IAC9C,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAC1C,8CAA8C;IAC9C,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC;IACpD,gEAAgE;IAChE,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"ApprovalPrompt.d.ts","sourceRoot":"","sources":["../../src/components/ApprovalPrompt.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kEAAkE,CAAC;AACxG,OAAO,EAAE,cAAc,EAAE,MAAM,8DAA8D,CAAC;AAO9F,wCAAwC;AACxC,MAAM,WAAW,mBAAmB;IAClC,8CAA8C;IAC9C,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAC1C,8CAA8C;IAC9C,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC;IACpD,gEAAgE;IAChE,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAuCD;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,EAC7B,eAAe,EACf,QAAQ,EACR,YAAoB,EACpB,QAAe,GAChB,EAAE,mBAAmB,2CA0IrB"}
|
|
@@ -40,7 +40,7 @@ function buildApproveAllLabel(toolName, mcpServerSlug) {
|
|
|
40
40
|
* file edit / delete / shell category) — other classes keep prompting. The
|
|
41
41
|
* option label names that class so the scope is never a surprise.
|
|
42
42
|
*/
|
|
43
|
-
export function ApprovalPrompt({ pendingApproval, onSubmit, isSubmitting = false, }) {
|
|
43
|
+
export function ApprovalPrompt({ pendingApproval, onSubmit, isSubmitting = false, isActive = true, }) {
|
|
44
44
|
const [selectedIndex, setSelectedIndex] = useState(0);
|
|
45
45
|
const options = useMemo(() => [
|
|
46
46
|
{
|
|
@@ -86,7 +86,7 @@ export function ApprovalPrompt({ pendingApproval, onSubmit, isSubmitting = false
|
|
|
86
86
|
onSubmit(options[shortcutMatch].action);
|
|
87
87
|
}
|
|
88
88
|
}
|
|
89
|
-
});
|
|
89
|
+
}, { isActive: isActive && !isSubmitting });
|
|
90
90
|
const serverSlug = pendingApproval.mcpServerSlug;
|
|
91
91
|
const toolLabel = serverSlug
|
|
92
92
|
? `${serverSlug}/${pendingApproval.toolName}`
|
|
@@ -95,6 +95,12 @@ export function ApprovalPrompt({ pendingApproval, onSubmit, isSubmitting = false
|
|
|
95
95
|
// PendingApproval. Mirrors the React card's gate-reason line so the terminal
|
|
96
96
|
// surface explains the gate at parity. Empty for legacy executions.
|
|
97
97
|
const gateReason = describeApprovalPolicySource(pendingApproval.approvalPolicySource);
|
|
98
|
-
return (_jsxs(Box, { flexDirection: "column", paddingLeft: 2, paddingTop: 1, paddingBottom: 1, borderStyle: "round", borderColor: "yellow", children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { color: "yellow", bold: true, children: "\u26A0 Approval required" }), pendingApproval.fromSubAgent && (_jsxs(Text, { dimColor: true, children: ["via ", pendingApproval.subAgentSubject || pendingApproval.subAgentName] }))] }), _jsxs(Box, { paddingLeft: 2, marginTop: 1, flexDirection: "column", children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { dimColor: true, children: "Tool:" }), _jsx(Text, { bold: true, children: toolLabel })] }), pendingApproval.argsPreview && (_jsxs(Box, { gap: 1, children: [_jsx(Text, { dimColor: true, children: "Args:" }), _jsx(Text, { wrap: "truncate-end", children: pendingApproval.argsPreview })] })), gateReason && (_jsxs(Box, { gap: 1, children: [_jsx(Text, { dimColor: true, children: "Why:" }), _jsx(Text, { dimColor: true, italic: true, children: gateReason })] }))] }), _jsx(Box, { gap: 2, marginTop: 1, paddingLeft: 2, children: options.map((opt, idx) =>
|
|
98
|
+
return (_jsxs(Box, { flexDirection: "column", paddingLeft: 2, paddingTop: 1, paddingBottom: 1, borderStyle: "round", borderColor: "yellow", children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { color: "yellow", bold: true, children: "\u26A0 Approval required" }), pendingApproval.fromSubAgent && (_jsxs(Text, { dimColor: true, children: ["via ", pendingApproval.subAgentSubject || pendingApproval.subAgentName] }))] }), _jsxs(Box, { paddingLeft: 2, marginTop: 1, flexDirection: "column", children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { dimColor: true, children: "Tool:" }), _jsx(Text, { bold: true, children: toolLabel })] }), pendingApproval.argsPreview && (_jsxs(Box, { gap: 1, children: [_jsx(Text, { dimColor: true, children: "Args:" }), _jsx(Text, { wrap: "truncate-end", children: pendingApproval.argsPreview })] })), gateReason && (_jsxs(Box, { gap: 1, children: [_jsx(Text, { dimColor: true, children: "Why:" }), _jsx(Text, { dimColor: true, italic: true, children: gateReason })] }))] }), _jsx(Box, { gap: 2, marginTop: 1, paddingLeft: 2, children: options.map((opt, idx) => {
|
|
99
|
+
// When inactive, no option is selected and all read dim — the active
|
|
100
|
+
// prompt's highlight (vs. these dimmed rows) is the cue for which
|
|
101
|
+
// approval owns the keyboard, so no per-prompt hint is needed.
|
|
102
|
+
const selected = isActive && idx === selectedIndex;
|
|
103
|
+
return (_jsxs(Text, { color: selected ? opt.color : undefined, dimColor: !selected, bold: selected, children: [selected ? "▸ " : " ", "[", opt.shortcut, "] ", opt.label] }, opt.shortcut));
|
|
104
|
+
}) }), isSubmitting && (_jsx(Box, { paddingLeft: 2, marginTop: 1, children: _jsx(Text, { dimColor: true, children: "Submitting..." }) }))] }));
|
|
99
105
|
}
|
|
100
106
|
//# sourceMappingURL=ApprovalPrompt.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApprovalPrompt.js","sourceRoot":"","sources":["../../src/components/ApprovalPrompt.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAE1C,OAAO,EAAE,cAAc,EAAE,MAAM,8DAA8D,CAAC;AAC9F,OAAO,EACL,QAAQ,EACR,qBAAqB,EACrB,4BAA4B,GAC7B,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"ApprovalPrompt.js","sourceRoot":"","sources":["../../src/components/ApprovalPrompt.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileChangeProgressBar.d.ts","sourceRoot":"","sources":["../../src/components/FileChangeProgressBar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oEAAoE,CAAC;
|
|
1
|
+
{"version":3,"file":"FileChangeProgressBar.d.ts","sourceRoot":"","sources":["../../src/components/FileChangeProgressBar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oEAAoE,CAAC;AAI7G,+CAA+C;AAC/C,MAAM,WAAW,0BAA0B;IACzC;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,GAAG,SAAS,CAAC;IAClD;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,QAAQ,EACR,QAAgB,GACjB,EAAE,0BAA0B,kDA0C5B"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Box, Text } from "ink";
|
|
3
3
|
import { kindLetter, progressEntryDisplayPath } from "../file-review.js";
|
|
4
|
+
import { FileLineStats } from "./FileReviewAtoms.js";
|
|
4
5
|
/**
|
|
5
6
|
* The terminal analogue of the web's non-interactive "N files changing…" strip
|
|
6
7
|
* (`@stigmer/react` `FileChangeProgressBar`), for a turn that is still running.
|
|
@@ -31,25 +32,9 @@ export function FileChangeProgressBar({ progress, expanded = false, }) {
|
|
|
31
32
|
return null;
|
|
32
33
|
const { filesChanged, linesAdded, linesRemoved, entries } = progress;
|
|
33
34
|
const hiddenCount = filesChanged - entries.length;
|
|
34
|
-
return (_jsxs(Box, { flexDirection: "column", paddingLeft: 1, children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { dimColor: true, children: "\u270E" }), _jsxs(Text, { dimColor: true, children: [filesChanged, " file", filesChanged === 1 ? "" : "s", " changing\u2026"] }), _jsx(
|
|
35
|
+
return (_jsxs(Box, { flexDirection: "column", paddingLeft: 1, children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { dimColor: true, children: "\u270E" }), _jsxs(Text, { dimColor: true, children: [filesChanged, " file", filesChanged === 1 ? "" : "s", " changing\u2026"] }), _jsx(FileLineStats, { linesAdded: linesAdded, linesRemoved: linesRemoved })] }), expanded && (_jsxs(Box, { flexDirection: "column", paddingLeft: 2, children: [entries.map((entry, idx) => {
|
|
35
36
|
const path = progressEntryDisplayPath(entry);
|
|
36
|
-
return (_jsxs(Box, { gap: 1, children: [_jsx(Text, { dimColor: true, children: kindLetter(entry.kind) }), _jsx(Text, { dimColor: true, wrap: "truncate-end", children: path }), _jsx(
|
|
37
|
+
return (_jsxs(Box, { gap: 1, children: [_jsx(Text, { dimColor: true, children: kindLetter(entry.kind) }), _jsx(Text, { dimColor: true, wrap: "truncate-end", children: path }), _jsx(FileLineStats, { linesAdded: entry.linesAdded, linesRemoved: entry.linesRemoved })] }, `${path}-${idx}`));
|
|
37
38
|
}), hiddenCount > 0 && (_jsx(Box, { children: _jsxs(Text, { dimColor: true, children: ["\u2026 and ", hiddenCount, " more"] }) }))] }))] }));
|
|
38
39
|
}
|
|
39
|
-
/**
|
|
40
|
-
* The `+N −M` stat for one file (or the whole turn), in the diff colour
|
|
41
|
-
* vocabulary. Renders nothing when both counts are zero — the honest signal that
|
|
42
|
-
* no count exists (binary or secret-withheld changes) — rather than a misleading
|
|
43
|
-
* `+0 -0`, matching the web `FileLineStats` contract.
|
|
44
|
-
*
|
|
45
|
-
* Kept module-local: this is the only consumer today. When `FileReviewPrompt`
|
|
46
|
-
* and `FileReviewRecord` gain `+N −M` (the deferred "CLI +N −M parity"
|
|
47
|
-
* follow-up), lift this into a shared ink atom (the analogue of `sdk/react`'s
|
|
48
|
-
* `FileReviewAtoms`) so the three surfaces cannot drift — do not copy it.
|
|
49
|
-
*/
|
|
50
|
-
function LineStats({ linesAdded, linesRemoved, }) {
|
|
51
|
-
if (linesAdded === 0 && linesRemoved === 0)
|
|
52
|
-
return null;
|
|
53
|
-
return (_jsxs(Text, { children: [_jsxs(Text, { color: "green", children: ["+", linesAdded] }), _jsxs(Text, { color: "red", children: [" -", linesRemoved] })] }));
|
|
54
|
-
}
|
|
55
40
|
//# sourceMappingURL=FileChangeProgressBar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileChangeProgressBar.js","sourceRoot":"","sources":["../../src/components/FileChangeProgressBar.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,OAAO,EAAE,UAAU,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"FileChangeProgressBar.js","sourceRoot":"","sources":["../../src/components/FileChangeProgressBar.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,OAAO,EAAE,UAAU,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAqBrD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,qBAAqB,CAAC,EACpC,QAAQ,EACR,QAAQ,GAAG,KAAK,GACW;IAC3B,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,YAAY,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE1D,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC;IACrE,MAAM,WAAW,GAAG,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAElD,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,WAAW,EAAE,CAAC,aACxC,MAAC,GAAG,IAAC,GAAG,EAAE,CAAC,aACT,KAAC,IAAI,IAAC,QAAQ,6BAAS,EACvB,MAAC,IAAI,IAAC,QAAQ,mBACX,YAAY,WAAO,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,uBAC5C,EACP,KAAC,aAAa,IAAC,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,GAAI,IACjE,EAEL,QAAQ,IAAI,CACX,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,WAAW,EAAE,CAAC,aACvC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;wBAC1B,MAAM,IAAI,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;wBAC7C,OAAO,CACL,MAAC,GAAG,IAAwB,GAAG,EAAE,CAAC,aAChC,KAAC,IAAI,IAAC,QAAQ,kBAAE,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,GAAQ,EAC9C,KAAC,IAAI,IAAC,QAAQ,QAAC,IAAI,EAAC,cAAc,YAC/B,IAAI,GACA,EACP,KAAC,aAAa,IACZ,UAAU,EAAE,KAAK,CAAC,UAAU,EAC5B,YAAY,EAAE,KAAK,CAAC,YAAY,GAChC,KARM,GAAG,IAAI,IAAI,GAAG,EAAE,CASpB,CACP,CAAC;oBACJ,CAAC,CAAC,EACD,WAAW,GAAG,CAAC,IAAI,CAClB,KAAC,GAAG,cACF,MAAC,IAAI,IAAC,QAAQ,kCAAQ,WAAW,aAAa,GAC1C,CACP,IACG,CACP,IACG,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { CapturedFileChange } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/filereview_pb";
|
|
2
|
+
/** Props for {@link FileDiffBody}. */
|
|
3
|
+
export interface FileDiffBodyProps {
|
|
4
|
+
/** The captured file change whose before/after diff to render. */
|
|
5
|
+
readonly change: CapturedFileChange;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* The terminal analogue of `@stigmer/react`'s `FileChangeDiff` — the whole-file
|
|
9
|
+
* branch. Renders a single `CapturedFileChange`'s unified diff for review in the
|
|
10
|
+
* terminal.
|
|
11
|
+
*
|
|
12
|
+
* A capture is always whole-file (`toDisplayFileChange` emits
|
|
13
|
+
* `captureLevel = WHOLE_FILE`), so this deliberately handles only that case: it
|
|
14
|
+
* resolves the before/after text via the shared `useFileChangeContent` behavior
|
|
15
|
+
* hook (inline bodies cost nothing; offloaded bodies are fetched lazily through
|
|
16
|
+
* the server proxy) and diffs them with the shared pure `computeDiff` — the SAME
|
|
17
|
+
* engine the web renders, so the terminal and web diffs are line-for-line
|
|
18
|
+
* identical and cannot drift.
|
|
19
|
+
*
|
|
20
|
+
* Renders body-only (no filename caption): the caller's selected row already
|
|
21
|
+
* names the file and shows its `+N −M`, so a header here would just repeat what
|
|
22
|
+
* the reviewer read one line up.
|
|
23
|
+
*
|
|
24
|
+
* **Requires an `InkStigmerProvider` ancestor.** `useFileChangeContent` reads the
|
|
25
|
+
* Stigmer client via `useStigmer()` (to dereference offloaded diff bytes), which
|
|
26
|
+
* throws outside a provider. In a live session this always holds — `SessionView`
|
|
27
|
+
* renders under `InkStigmerProvider`.
|
|
28
|
+
*/
|
|
29
|
+
export declare function FileDiffBody({ change }: FileDiffBodyProps): import("react/jsx-runtime").JSX.Element;
|
|
30
|
+
//# sourceMappingURL=FileDiffBody.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileDiffBody.d.ts","sourceRoot":"","sources":["../../src/components/FileDiffBody.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oEAAoE,CAAC;AAiB7G,sCAAsC;AACtC,MAAM,WAAW,iBAAiB;IAChC,kEAAkE;IAClE,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC;CACrC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,EAAE,iBAAiB,2CA6CzD"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo } from "react";
|
|
3
|
+
import { Box, Text } from "ink";
|
|
4
|
+
import { FileChangeType } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
5
|
+
import { computeDiff, useFileChangeContent, } from "@stigmer/react";
|
|
6
|
+
import { toDisplayFileChange } from "@stigmer/sdk";
|
|
7
|
+
/**
|
|
8
|
+
* The most diff lines a single file's body renders before it is capped. A
|
|
9
|
+
* terminal has no scroll-within-region, so an unbounded diff would flood the
|
|
10
|
+
* scrollback; beyond this the remainder is summarized in a `… K more lines`
|
|
11
|
+
* footer (the terminal analogue of the web's `BoundedContent` clamp).
|
|
12
|
+
*/
|
|
13
|
+
const DIFF_MAX_LINES = 200;
|
|
14
|
+
/**
|
|
15
|
+
* The terminal analogue of `@stigmer/react`'s `FileChangeDiff` — the whole-file
|
|
16
|
+
* branch. Renders a single `CapturedFileChange`'s unified diff for review in the
|
|
17
|
+
* terminal.
|
|
18
|
+
*
|
|
19
|
+
* A capture is always whole-file (`toDisplayFileChange` emits
|
|
20
|
+
* `captureLevel = WHOLE_FILE`), so this deliberately handles only that case: it
|
|
21
|
+
* resolves the before/after text via the shared `useFileChangeContent` behavior
|
|
22
|
+
* hook (inline bodies cost nothing; offloaded bodies are fetched lazily through
|
|
23
|
+
* the server proxy) and diffs them with the shared pure `computeDiff` — the SAME
|
|
24
|
+
* engine the web renders, so the terminal and web diffs are line-for-line
|
|
25
|
+
* identical and cannot drift.
|
|
26
|
+
*
|
|
27
|
+
* Renders body-only (no filename caption): the caller's selected row already
|
|
28
|
+
* names the file and shows its `+N −M`, so a header here would just repeat what
|
|
29
|
+
* the reviewer read one line up.
|
|
30
|
+
*
|
|
31
|
+
* **Requires an `InkStigmerProvider` ancestor.** `useFileChangeContent` reads the
|
|
32
|
+
* Stigmer client via `useStigmer()` (to dereference offloaded diff bytes), which
|
|
33
|
+
* throws outside a provider. In a live session this always holds — `SessionView`
|
|
34
|
+
* renders under `InkStigmerProvider`.
|
|
35
|
+
*/
|
|
36
|
+
export function FileDiffBody({ change }) {
|
|
37
|
+
const displayChange = useMemo(() => toDisplayFileChange(change), [change]);
|
|
38
|
+
const { beforeText, afterText, isBinary, isLoading, error, isTruncated, downloadUrl } = useFileChangeContent(displayChange);
|
|
39
|
+
const hunks = useMemo(() => {
|
|
40
|
+
if (beforeText === null || afterText === null)
|
|
41
|
+
return [];
|
|
42
|
+
return computeDiff(beforeText, afterText);
|
|
43
|
+
}, [beforeText, afterText]);
|
|
44
|
+
// Honest state precedence, mirroring the web FileChangeBody's whole-file arm:
|
|
45
|
+
// a binary has no text diff; a server-truncated body cannot be diffed inline;
|
|
46
|
+
// an offloaded body may still be loading or have failed; only then do we trust
|
|
47
|
+
// an empty hunk list to mean the file genuinely has no visible change.
|
|
48
|
+
if (isBinary) {
|
|
49
|
+
return _jsx(Notice, { children: "Binary file changed." });
|
|
50
|
+
}
|
|
51
|
+
if (isTruncated) {
|
|
52
|
+
return (_jsxs(Notice, { children: ["This file is too large to diff inline.", downloadUrl ? ` Download the full file: ${downloadUrl}` : ""] }));
|
|
53
|
+
}
|
|
54
|
+
if (isLoading) {
|
|
55
|
+
return _jsx(Notice, { children: "Loading diff\u2026" });
|
|
56
|
+
}
|
|
57
|
+
if (error) {
|
|
58
|
+
return _jsx(Notice, { tone: "error", children: "Could not load this file's contents." });
|
|
59
|
+
}
|
|
60
|
+
if (hunks.length === 0) {
|
|
61
|
+
// A CREATE with nothing to show is a genuinely empty new file; anything else
|
|
62
|
+
// with no renderable diff is the non-committal "no preview" — we never claim
|
|
63
|
+
// emptiness we cannot prove from the capture.
|
|
64
|
+
return (_jsx(Notice, { children: displayChange.changeType === FileChangeType.CREATE
|
|
65
|
+
? "Empty new file."
|
|
66
|
+
: "No preview available." }));
|
|
67
|
+
}
|
|
68
|
+
return _jsx(DiffHunks, { hunks: hunks });
|
|
69
|
+
}
|
|
70
|
+
/** Flattens hunks into a single row stream so the line cap spans the whole diff. */
|
|
71
|
+
function flattenHunks(hunks) {
|
|
72
|
+
const rows = [];
|
|
73
|
+
for (const hunk of hunks) {
|
|
74
|
+
rows.push({
|
|
75
|
+
kind: "header",
|
|
76
|
+
text: `@@ -${hunk.oldStart},${hunk.oldLines} +${hunk.newStart},${hunk.newLines} @@`,
|
|
77
|
+
});
|
|
78
|
+
for (const line of hunk.lines) {
|
|
79
|
+
rows.push({ kind: "line", type: line.type, content: line.content });
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return rows;
|
|
83
|
+
}
|
|
84
|
+
function DiffHunks({ hunks }) {
|
|
85
|
+
const rows = useMemo(() => flattenHunks(hunks), [hunks]);
|
|
86
|
+
const shown = rows.slice(0, DIFF_MAX_LINES);
|
|
87
|
+
const overflow = rows.length - shown.length;
|
|
88
|
+
return (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [shown.map((row, i) => (_jsx(DiffRowText, { row: row }, i))), overflow > 0 && (_jsxs(Text, { dimColor: true, children: ["\u2026 ", overflow, " more line", overflow === 1 ? "" : "s"] }))] }));
|
|
89
|
+
}
|
|
90
|
+
function DiffRowText({ row }) {
|
|
91
|
+
if (row.kind === "header") {
|
|
92
|
+
return _jsx(Text, { dimColor: true, children: row.text });
|
|
93
|
+
}
|
|
94
|
+
if (row.type === "added") {
|
|
95
|
+
return _jsxs(Text, { color: "green", children: ["+", row.content] });
|
|
96
|
+
}
|
|
97
|
+
if (row.type === "removed") {
|
|
98
|
+
return _jsxs(Text, { color: "red", children: ["-", row.content] });
|
|
99
|
+
}
|
|
100
|
+
return _jsxs(Text, { dimColor: true, children: [" ", row.content] });
|
|
101
|
+
}
|
|
102
|
+
/** A short status line for a non-renderable diff (binary / truncated / loading / error / empty). */
|
|
103
|
+
function Notice({ children, tone = "muted", }) {
|
|
104
|
+
return (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: tone === "error" ? "red" : undefined, dimColor: tone !== "error", children: children }) }));
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=FileDiffBody.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileDiffBody.js","sourceRoot":"","sources":["../../src/components/FileDiffBody.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared presentational atoms for the terminal file-review surfaces — the single
|
|
3
|
+
* source for the `+N −M` line stat, so the decision prompt, the settled record,
|
|
4
|
+
* and the mid-run progress bar can never drift in how they render a file's (or a
|
|
5
|
+
* set's) magnitude. The terminal analogue of `@stigmer/react`'s `FileReviewAtoms`.
|
|
6
|
+
*
|
|
7
|
+
* The change-kind marker is deliberately NOT here: the terminal renders kind via
|
|
8
|
+
* the pure `kindLetter` helper (in `file-review.ts`), already shared across every
|
|
9
|
+
* surface. The web needs a `FileKindBadge` component because its marker carries
|
|
10
|
+
* per-kind color tokens and a11y labels; a plain letter needs neither.
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* The `+N −M` stat for one file (or a whole set), in the diff colour vocabulary.
|
|
14
|
+
* Renders nothing when both counts are zero — the honest signal that no count
|
|
15
|
+
* exists (binary or secret-withheld changes, or records captured before the
|
|
16
|
+
* counts were stamped) — rather than a misleading `+0 -0`, matching the web
|
|
17
|
+
* `FileLineStats` contract.
|
|
18
|
+
*/
|
|
19
|
+
export declare function FileLineStats({ linesAdded, linesRemoved, }: {
|
|
20
|
+
readonly linesAdded: number;
|
|
21
|
+
readonly linesRemoved: number;
|
|
22
|
+
}): import("react/jsx-runtime").JSX.Element | null;
|
|
23
|
+
//# sourceMappingURL=FileReviewAtoms.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileReviewAtoms.d.ts","sourceRoot":"","sources":["../../src/components/FileReviewAtoms.tsx"],"names":[],"mappings":"AAGA;;;;;;;;;;GAUG;AAEH;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,EAC5B,UAAU,EACV,YAAY,GACb,EAAE;IACD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B,kDAQA"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Text } from "ink";
|
|
3
|
+
/**
|
|
4
|
+
* Shared presentational atoms for the terminal file-review surfaces — the single
|
|
5
|
+
* source for the `+N −M` line stat, so the decision prompt, the settled record,
|
|
6
|
+
* and the mid-run progress bar can never drift in how they render a file's (or a
|
|
7
|
+
* set's) magnitude. The terminal analogue of `@stigmer/react`'s `FileReviewAtoms`.
|
|
8
|
+
*
|
|
9
|
+
* The change-kind marker is deliberately NOT here: the terminal renders kind via
|
|
10
|
+
* the pure `kindLetter` helper (in `file-review.ts`), already shared across every
|
|
11
|
+
* surface. The web needs a `FileKindBadge` component because its marker carries
|
|
12
|
+
* per-kind color tokens and a11y labels; a plain letter needs neither.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* The `+N −M` stat for one file (or a whole set), in the diff colour vocabulary.
|
|
16
|
+
* Renders nothing when both counts are zero — the honest signal that no count
|
|
17
|
+
* exists (binary or secret-withheld changes, or records captured before the
|
|
18
|
+
* counts were stamped) — rather than a misleading `+0 -0`, matching the web
|
|
19
|
+
* `FileLineStats` contract.
|
|
20
|
+
*/
|
|
21
|
+
export function FileLineStats({ linesAdded, linesRemoved, }) {
|
|
22
|
+
if (linesAdded === 0 && linesRemoved === 0)
|
|
23
|
+
return null;
|
|
24
|
+
return (_jsxs(Text, { children: [_jsxs(Text, { color: "green", children: ["+", linesAdded] }), _jsxs(Text, { color: "red", children: [" -", linesRemoved] })] }));
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=FileReviewAtoms.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileReviewAtoms.js","sourceRoot":"","sources":["../../src/components/FileReviewAtoms.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAE3B;;;;;;;;;;GAUG;AAEH;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,EAC5B,UAAU,EACV,YAAY,GAIb;IACC,IAAI,UAAU,KAAK,CAAC,IAAI,YAAY,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACxD,OAAO,CACL,MAAC,IAAI,eACH,MAAC,IAAI,IAAC,KAAK,EAAC,OAAO,kBAAG,UAAU,IAAQ,EACxC,MAAC,IAAI,IAAC,KAAK,EAAC,KAAK,mBAAI,YAAY,IAAQ,IACpC,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileReviewPrompt.d.ts","sourceRoot":"","sources":["../../src/components/FileReviewPrompt.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,aAAa,EACd,MAAM,oEAAoE,CAAC;AAC5E,OAAO,EACL,kBAAkB,EAEnB,MAAM,8DAA8D,CAAC;AACtE,OAAO,EAKL,KAAK,mBAAmB,EACzB,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"FileReviewPrompt.d.ts","sourceRoot":"","sources":["../../src/components/FileReviewPrompt.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,aAAa,EACd,MAAM,oEAAoE,CAAC;AAC5E,OAAO,EACL,kBAAkB,EAEnB,MAAM,8DAA8D,CAAC;AACtE,OAAO,EAKL,KAAK,mBAAmB,EACzB,MAAM,gBAAgB,CAAC;AAUxB,0CAA0C;AAC1C,MAAM,WAAW,qBAAqB;IACpC,0DAA0D;IAC1D,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;IAClC;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,CACjB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,kBAAkB,EAC1B,OAAO,CAAC,EAAE,mBAAmB,KAC1B,IAAI,CAAC;IACV,kFAAkF;IAClF,QAAQ,CAAC,sBAAsB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACtD,0DAA0D;IAC1D,QAAQ,CAAC,cAAc,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACrD;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AA2BD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,SAAS,EACT,QAAQ,EACR,sBAAsB,EACtB,cAAc,EACd,QAAe,GAChB,EAAE,qBAAqB,2CA2LvB"}
|
|
@@ -3,7 +3,9 @@ import { useMemo, useState } from "react";
|
|
|
3
3
|
import { Box, Text, useInput } from "ink";
|
|
4
4
|
import { FileDecisionAction, FileDecisionScope, } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
5
5
|
import { changeSetReviewability, fileReviewability, deriveEffectiveVerdicts, } from "@stigmer/react";
|
|
6
|
-
import { blockReasonNote, changeDisplayPath, kindLetter } from "../file-review.js";
|
|
6
|
+
import { blockReasonNote, changeDisplayPath, changeSetLineStats, kindLetter, } from "../file-review.js";
|
|
7
|
+
import { FileLineStats } from "./FileReviewAtoms.js";
|
|
8
|
+
import { FileDiffBody } from "./FileDiffBody.js";
|
|
7
9
|
/**
|
|
8
10
|
* The bulk approve/reject verb labels for a set, mirroring the web card's
|
|
9
11
|
* `bulkLabels`: "Keep" for a binary-only set (its bytes are applied as-is),
|
|
@@ -51,6 +53,9 @@ export function FileReviewPrompt({ changeSet, onSubmit, submittingDecisionKeys,
|
|
|
51
53
|
n++;
|
|
52
54
|
return n;
|
|
53
55
|
}, [changes, verdicts]);
|
|
56
|
+
// The set's aggregate +N −M, shown beside the header so the bar carries the
|
|
57
|
+
// magnitude of what is being decided, not just the file count (web parity).
|
|
58
|
+
const lineStats = useMemo(() => changeSetLineStats(changeSet), [changeSet]);
|
|
54
59
|
const labels = bulkLabels(total, decidedCount, binaryOnly);
|
|
55
60
|
// Busy while any decision for THIS set is in flight (whole-set key or any
|
|
56
61
|
// per-file key). Blocks input to avoid a double-submit mid-request.
|
|
@@ -151,10 +156,16 @@ export function FileReviewPrompt({ changeSet, onSubmit, submittingDecisionKeys,
|
|
|
151
156
|
if (match)
|
|
152
157
|
match.run();
|
|
153
158
|
}, { isActive: isActive && !busy });
|
|
154
|
-
return (_jsxs(Box, { flexDirection: "column", paddingLeft: 2, paddingTop: 1, paddingBottom: 1, borderStyle: "round", borderColor: "cyan", children: [
|
|
159
|
+
return (_jsxs(Box, { flexDirection: "column", paddingLeft: 2, paddingTop: 1, paddingBottom: 1, borderStyle: "round", borderColor: "cyan", children: [_jsxs(Box, { gap: 1, children: [_jsxs(Text, { color: "cyan", bold: true, children: ["\u270E ", total, " file", total === 1 ? "" : "s", " awaiting review"] }), _jsx(FileLineStats, { linesAdded: lineStats.linesAdded, linesRemoved: lineStats.linesRemoved })] }), perFile ? (_jsx(PerFileList, { changes: changes, verdicts: verdicts, selectedIndex: selectedIndex, interactive: isActive && !busy })) : (_jsx(Box, { gap: 2, marginTop: 1, paddingLeft: 2, children: bulkOptions.map((opt) => (_jsxs(Text, { color: opt.color, children: ["[", opt.shortcut, "] ", opt.label] }, opt.shortcut))) })), busy && (_jsx(Box, { paddingLeft: 2, marginTop: 1, children: _jsx(Text, { dimColor: true, children: "Submitting..." }) })), errorText && (_jsx(Box, { paddingLeft: 2, marginTop: 1, children: _jsxs(Text, { color: "red", children: ["Decision failed: ", errorText] }) })), !isActive && !perFile && (_jsx(Box, { paddingLeft: 2, marginTop: 1, children: _jsx(Text, { dimColor: true, italic: true, children: "Resolve the pending approval first" }) }))] }));
|
|
155
160
|
}
|
|
156
|
-
/**
|
|
161
|
+
/**
|
|
162
|
+
* The per-file review list: kind letter, path, verdict/keepability, and a hint,
|
|
163
|
+
* followed by a master-detail diff pane for the selected file. The list itself
|
|
164
|
+
* stays stable as the selection moves (the diff renders in a fixed pane below,
|
|
165
|
+
* not inline between rows), so navigating never reflows the rows above.
|
|
166
|
+
*/
|
|
157
167
|
function PerFileList({ changes, verdicts, selectedIndex, interactive, }) {
|
|
168
|
+
const selectedChange = changes[selectedIndex];
|
|
158
169
|
return (_jsxs(Box, { flexDirection: "column", marginTop: 1, paddingLeft: 2, children: [changes.map((change, idx) => {
|
|
159
170
|
const selected = idx === selectedIndex;
|
|
160
171
|
const verdict = verdicts.get(change.id);
|
|
@@ -164,9 +175,9 @@ function PerFileList({ changes, verdicts, selectedIndex, interactive, }) {
|
|
|
164
175
|
: verdict === FileDecisionAction.REJECT
|
|
165
176
|
? "discarded"
|
|
166
177
|
: null;
|
|
167
|
-
return (_jsxs(Box, { gap: 1, children: [_jsx(Text, { color: selected ? "cyan" : undefined, children: selected ? "▸" : " " }), _jsx(Text, { dimColor: true, children: kindLetter(change.kind) }), _jsx(Text, { color: selected ? "cyan" : undefined, bold: selected, wrap: "truncate-end", children: changeDisplayPath(change) }), decided && _jsxs(Text, { dimColor: true, children: ["(", decided, ")"] }), !decided && note && _jsxs(Text, { color: "yellow", children: ["\u2014 ", note] })] }, change.id));
|
|
178
|
+
return (_jsxs(Box, { gap: 1, children: [_jsx(Text, { color: selected ? "cyan" : undefined, children: selected ? "▸" : " " }), _jsx(Text, { dimColor: true, children: kindLetter(change.kind) }), _jsx(Text, { color: selected ? "cyan" : undefined, bold: selected, wrap: "truncate-end", children: changeDisplayPath(change) }), _jsx(FileLineStats, { linesAdded: change.linesAdded, linesRemoved: change.linesRemoved }), decided && _jsxs(Text, { dimColor: true, children: ["(", decided, ")"] }), !decided && note && _jsxs(Text, { color: "yellow", children: ["\u2014 ", note] })] }, change.id));
|
|
168
179
|
}), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: interactive
|
|
169
180
|
? "↑/↓ move · [k] keep · [d] discard · [esc] back"
|
|
170
|
-
: "read-only" }) })] }));
|
|
181
|
+
: "read-only" }) }), selectedChange && (_jsx(FileDiffBody, { change: selectedChange }, selectedChange.id))] }));
|
|
171
182
|
}
|
|
172
183
|
//# sourceMappingURL=FileReviewPrompt.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileReviewPrompt.js","sourceRoot":"","sources":["../../src/components/FileReviewPrompt.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAK1C,OAAO,EACL,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,8DAA8D,CAAC;AACtE,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,uBAAuB,GAGxB,MAAM,gBAAgB,CAAC;AACxB,OAAO,
|
|
1
|
+
{"version":3,"file":"FileReviewPrompt.js","sourceRoot":"","sources":["../../src/components/FileReviewPrompt.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileReviewRecord.d.ts","sourceRoot":"","sources":["../../src/components/FileReviewRecord.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oEAAoE,CAAC;
|
|
1
|
+
{"version":3,"file":"FileReviewRecord.d.ts","sourceRoot":"","sources":["../../src/components/FileReviewRecord.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oEAAoE,CAAC;AAcxG,0CAA0C;AAC1C,MAAM,WAAW,qBAAqB;IACpC,sEAAsE;IACtE,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;CACvC;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,aAAa,EAAE,EAAE,qBAAqB,2CAyCxE"}
|
|
@@ -2,7 +2,8 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { Box, Text } from "ink";
|
|
3
3
|
import { FileChangeSetStatus, FileDecisionAction, } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
4
4
|
import { deriveEffectiveVerdicts } from "@stigmer/react";
|
|
5
|
-
import { changeDisplayPath, kindLetter, settledSummary, } from "../file-review.js";
|
|
5
|
+
import { changeDisplayPath, changeSetLineStats, kindLetter, settledSummary, } from "../file-review.js";
|
|
6
|
+
import { FileLineStats } from "./FileReviewAtoms.js";
|
|
6
7
|
/**
|
|
7
8
|
* A read-only, append-only record of a SETTLED file-review change set — the
|
|
8
9
|
* terminal analogue of the web's in-thread `FileReviewRecordRow` (DD-27 D2).
|
|
@@ -17,7 +18,8 @@ export function FileReviewRecord({ fileChangeSet }) {
|
|
|
17
18
|
const failed = fileChangeSet.status === FileChangeSetStatus.FAILED;
|
|
18
19
|
const verdicts = deriveEffectiveVerdicts(fileChangeSet);
|
|
19
20
|
const summary = failed ? "review failed" : settledSummary(fileChangeSet);
|
|
20
|
-
|
|
21
|
+
const lineStats = changeSetLineStats(fileChangeSet);
|
|
22
|
+
return (_jsxs(Box, { flexDirection: "column", paddingLeft: 2, children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { dimColor: true, children: "\u270E" }), _jsxs(Text, { dimColor: true, children: ["File review \u2014 ", summary] }), _jsx(FileLineStats, { linesAdded: lineStats.linesAdded, linesRemoved: lineStats.linesRemoved })] }), fileChangeSet.changes.map((change) => {
|
|
21
23
|
const verdict = verdicts.get(change.id);
|
|
22
24
|
const label = failed
|
|
23
25
|
? null
|
|
@@ -26,7 +28,7 @@ export function FileReviewRecord({ fileChangeSet }) {
|
|
|
26
28
|
: verdict === FileDecisionAction.REJECT
|
|
27
29
|
? "discarded"
|
|
28
30
|
: "not reviewed";
|
|
29
|
-
return (_jsxs(Box, { paddingLeft: 2, gap: 1, children: [_jsx(Text, { dimColor: true, children: kindLetter(change.kind) }), _jsx(Text, { dimColor: true, wrap: "truncate-end", children: changeDisplayPath(change) }), label && _jsxs(Text, { dimColor: true, children: ["(", label, ")"] })] }, change.id));
|
|
31
|
+
return (_jsxs(Box, { paddingLeft: 2, gap: 1, children: [_jsx(Text, { dimColor: true, children: kindLetter(change.kind) }), _jsx(Text, { dimColor: true, wrap: "truncate-end", children: changeDisplayPath(change) }), _jsx(FileLineStats, { linesAdded: change.linesAdded, linesRemoved: change.linesRemoved }), label && _jsxs(Text, { dimColor: true, children: ["(", label, ")"] })] }, change.id));
|
|
30
32
|
})] }));
|
|
31
33
|
}
|
|
32
34
|
//# sourceMappingURL=FileReviewRecord.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileReviewRecord.js","sourceRoot":"","sources":["../../src/components/FileReviewRecord.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,OAAO,EACL,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,8DAA8D,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EACL,iBAAiB,EACjB,UAAU,EACV,cAAc,GACf,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"FileReviewRecord.js","sourceRoot":"","sources":["../../src/components/FileReviewRecord.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,OAAO,EACL,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,8DAA8D,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,UAAU,EACV,cAAc,GACf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAQrD;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAAE,aAAa,EAAyB;IACvE,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,KAAK,mBAAmB,CAAC,MAAM,CAAC;IACnE,MAAM,QAAQ,GAAG,uBAAuB,CAAC,aAAa,CAAC,CAAC;IACxD,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;IACzE,MAAM,SAAS,GAAG,kBAAkB,CAAC,aAAa,CAAC,CAAC;IAEpD,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,WAAW,EAAE,CAAC,aACxC,MAAC,GAAG,IAAC,GAAG,EAAE,CAAC,aACT,KAAC,IAAI,IAAC,QAAQ,6BAAS,EACvB,MAAC,IAAI,IAAC,QAAQ,0CAAgB,OAAO,IAAQ,EAC7C,KAAC,aAAa,IACZ,UAAU,EAAE,SAAS,CAAC,UAAU,EAChC,YAAY,EAAE,SAAS,CAAC,YAAY,GACpC,IACE,EACL,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;gBACpC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACxC,MAAM,KAAK,GAAG,MAAM;oBAClB,CAAC,CAAC,IAAI;oBACN,CAAC,CAAC,OAAO,KAAK,kBAAkB,CAAC,OAAO;wBACtC,CAAC,CAAC,MAAM;wBACR,CAAC,CAAC,OAAO,KAAK,kBAAkB,CAAC,MAAM;4BACrC,CAAC,CAAC,WAAW;4BACb,CAAC,CAAC,cAAc,CAAC;gBACvB,OAAO,CACL,MAAC,GAAG,IAAiB,WAAW,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,aACzC,KAAC,IAAI,IAAC,QAAQ,kBAAE,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,GAAQ,EAC/C,KAAC,IAAI,IAAC,QAAQ,QAAC,IAAI,EAAC,cAAc,YAC/B,iBAAiB,CAAC,MAAM,CAAC,GACrB,EACP,KAAC,aAAa,IACZ,UAAU,EAAE,MAAM,CAAC,UAAU,EAC7B,YAAY,EAAE,MAAM,CAAC,YAAY,GACjC,EACD,KAAK,IAAI,MAAC,IAAI,IAAC,QAAQ,wBAAG,KAAK,SAAS,KATjC,MAAM,CAAC,EAAE,CAUb,CACP,CAAC;YACJ,CAAC,CAAC,IACE,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageThread.d.ts","sourceRoot":"","sources":["../../src/components/MessageThread.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6DAA6D,CAAC;AASlG,OAAO,EACL,cAAc,EAIf,MAAM,8DAA8D,CAAC;AActE,uCAAuC;AACvC,MAAM,WAAW,kBAAkB;IACjC,mDAAmD;IACnD,QAAQ,CAAC,UAAU,EAAE,SAAS,cAAc,EAAE,CAAC;IAC/C,uEAAuE;IACvE,QAAQ,CAAC,qBAAqB,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IACvD,mEAAmE;IACnE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,sEAAsE;IACtE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAC1B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,cAAc,KACnB,IAAI,CAAC;IACV,mEAAmE;IACnE,QAAQ,CAAC,qBAAqB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACrD,wFAAwF;IACxF,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IACnC;;;;;;OAMG;IACH,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,CAAC;CAC1C;AAuMD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,EAC5B,UAAU,EACV,qBAAqB,EACrB,kBAAkB,EAClB,gBAAgB,EAChB,qBAAqB,EACrB,eAAuB,EACvB,qBAA6B,GAC9B,EAAE,kBAAkB,
|
|
1
|
+
{"version":3,"file":"MessageThread.d.ts","sourceRoot":"","sources":["../../src/components/MessageThread.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6DAA6D,CAAC;AASlG,OAAO,EACL,cAAc,EAIf,MAAM,8DAA8D,CAAC;AActE,uCAAuC;AACvC,MAAM,WAAW,kBAAkB;IACjC,mDAAmD;IACnD,QAAQ,CAAC,UAAU,EAAE,SAAS,cAAc,EAAE,CAAC;IAC/C,uEAAuE;IACvE,QAAQ,CAAC,qBAAqB,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IACvD,mEAAmE;IACnE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,sEAAsE;IACtE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAC1B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,cAAc,KACnB,IAAI,CAAC;IACV,mEAAmE;IACnE,QAAQ,CAAC,qBAAqB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACrD,wFAAwF;IACxF,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IACnC;;;;;;OAMG;IACH,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,CAAC;CAC1C;AAuMD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,EAC5B,UAAU,EACV,qBAAqB,EACrB,kBAAkB,EAClB,gBAAgB,EAChB,qBAAqB,EACrB,eAAuB,EACvB,qBAA6B,GAC9B,EAAE,kBAAkB,2CAyDpB"}
|
|
@@ -189,11 +189,17 @@ export function MessageThread({ executions, activeStreamExecution, pendingUserMe
|
|
|
189
189
|
showFileReviewRecords,
|
|
190
190
|
]);
|
|
191
191
|
const fileReviewContext = useMemo(() => buildChangeSetsById(executions, activeStreamExecution), [executions, activeStreamExecution]);
|
|
192
|
+
// The single active decision surface: stdin is delivered to every mounted
|
|
193
|
+
// `useInput`, so only the FIRST pending approval owns the keyboard — the rest
|
|
194
|
+
// render inert. The file-review prompt (in `SessionView`) in turn yields while
|
|
195
|
+
// any approval is pending, so the terminal always has exactly one interactive
|
|
196
|
+
// decision surface: first approval → else the file-review prompt.
|
|
197
|
+
const firstApprovalKey = useMemo(() => items.find((it) => it.kind === "approval")?.key, [items]);
|
|
192
198
|
const historyItems = items.slice(0, liveStart);
|
|
193
199
|
const liveItems = items.slice(liveStart);
|
|
194
|
-
return (_jsx(FileReviewContext.Provider, { value: fileReviewContext, children: _jsxs(Box, { flexDirection: "column", children: [_jsx(Static, { items: historyItems, children: (item) => (_jsx(Box, { flexDirection: "column", marginBottom: 1, children: renderItem(item, onApprovalSubmit, submittingApprovalIds, expandToolCalls) }, item.key)) }), liveItems.map((item) => (_jsx(Box, { flexDirection: "column", marginBottom: 1, children: renderItem(item, onApprovalSubmit, submittingApprovalIds, expandToolCalls) }, item.key)))] }) }));
|
|
200
|
+
return (_jsx(FileReviewContext.Provider, { value: fileReviewContext, children: _jsxs(Box, { flexDirection: "column", children: [_jsx(Static, { items: historyItems, children: (item) => (_jsx(Box, { flexDirection: "column", marginBottom: 1, children: renderItem(item, onApprovalSubmit, submittingApprovalIds, expandToolCalls, firstApprovalKey) }, item.key)) }), liveItems.map((item) => (_jsx(Box, { flexDirection: "column", marginBottom: 1, children: renderItem(item, onApprovalSubmit, submittingApprovalIds, expandToolCalls, firstApprovalKey) }, item.key)))] }) }));
|
|
195
201
|
}
|
|
196
|
-
function renderItem(item, onApprovalSubmit, submittingApprovalIds, expandToolCalls) {
|
|
202
|
+
function renderItem(item, onApprovalSubmit, submittingApprovalIds, expandToolCalls, activeApprovalKey) {
|
|
197
203
|
switch (item.kind) {
|
|
198
204
|
case "message":
|
|
199
205
|
return _jsx(MessageEntry, { message: item.message });
|
|
@@ -206,7 +212,9 @@ function renderItem(item, onApprovalSubmit, submittingApprovalIds, expandToolCal
|
|
|
206
212
|
case "file-review-record":
|
|
207
213
|
return _jsx(FileReviewRecord, { fileChangeSet: item.set });
|
|
208
214
|
case "approval":
|
|
209
|
-
return onApprovalSubmit ? (_jsx(ApprovalPrompt, { pendingApproval: item.pendingApproval, onSubmit: (action) => onApprovalSubmit(item.pendingApproval.toolCallId, action), isSubmitting: submittingApprovalIds?.has(item.pendingApproval.toolCallId) ?? false
|
|
215
|
+
return onApprovalSubmit ? (_jsx(ApprovalPrompt, { pendingApproval: item.pendingApproval, onSubmit: (action) => onApprovalSubmit(item.pendingApproval.toolCallId, action), isSubmitting: submittingApprovalIds?.has(item.pendingApproval.toolCallId) ?? false,
|
|
216
|
+
// Only the first pending approval is interactive (see firstApprovalKey).
|
|
217
|
+
isActive: item.key === activeApprovalKey })) : null;
|
|
210
218
|
case "pending-message":
|
|
211
219
|
return (_jsx(Box, { paddingLeft: 1, children: _jsx(Text, { dimColor: true, italic: true, children: item.content }) }));
|
|
212
220
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageThread.js","sourceRoot":"","sources":["../../src/components/MessageThread.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"MessageThread.js","sourceRoot":"","sources":["../../src/components/MessageThread.tsx"],"names":[],"mappings":"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"}
|