@stigmer/ink 3.1.1 → 3.1.2
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/app/SessionView.d.ts.map +1 -1
- package/app/SessionView.js +11 -1
- package/app/SessionView.js.map +1 -1
- package/components/FileReviewPrompt.d.ts +43 -0
- package/components/FileReviewPrompt.d.ts.map +1 -0
- package/components/FileReviewPrompt.js +172 -0
- package/components/FileReviewPrompt.js.map +1 -0
- package/components/FileReviewRecord.d.ts +18 -0
- package/components/FileReviewRecord.d.ts.map +1 -0
- package/components/FileReviewRecord.js +32 -0
- package/components/FileReviewRecord.js.map +1 -0
- package/components/MessageThread.d.ts +19 -7
- package/components/MessageThread.d.ts.map +1 -1
- package/components/MessageThread.js +145 -77
- package/components/MessageThread.js.map +1 -1
- package/components/ToolCallGroup.d.ts.map +1 -1
- package/components/ToolCallGroup.js +42 -2
- package/components/ToolCallGroup.js.map +1 -1
- package/components/ToolCallItem.d.ts.map +1 -1
- package/components/ToolCallItem.js +16 -1
- package/components/ToolCallItem.js.map +1 -1
- package/file-review.d.ts +41 -0
- package/file-review.d.ts.map +1 -0
- package/file-review.js +94 -0
- package/file-review.js.map +1 -0
- package/index.d.ts +3 -0
- package/index.d.ts.map +1 -1
- package/index.js +4 -0
- package/index.js.map +1 -1
- package/package.json +4 -4
- package/src/__tests__/file-review.test.tsx +496 -0
- package/src/app/SessionView.tsx +39 -3
- package/src/components/FileReviewPrompt.tsx +328 -0
- package/src/components/FileReviewRecord.tsx +63 -0
- package/src/components/MessageThread.tsx +199 -96
- package/src/components/ToolCallGroup.tsx +50 -1
- package/src/components/ToolCallItem.tsx +25 -0
- package/src/file-review.ts +109 -0
- package/src/index.ts +12 -0
|
@@ -3,62 +3,118 @@ import { useMemo } from "react";
|
|
|
3
3
|
import { Box, Text, Static } from "ink";
|
|
4
4
|
import { create } from "@bufbuild/protobuf";
|
|
5
5
|
import { AgentMessageSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
|
|
6
|
-
import { ExecutionPhase, MessageType, } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
7
|
-
import { isTerminalPhase } from "@stigmer/react";
|
|
6
|
+
import { ExecutionPhase, FileChangeSetStatus, MessageType, } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
7
|
+
import { isTerminalPhase, FileReviewContext, } from "@stigmer/react";
|
|
8
|
+
import { displayFileChangeSets } from "@stigmer/sdk";
|
|
8
9
|
import { MessageEntry } from "./MessageEntry.js";
|
|
9
10
|
import { ToolCallGroup } from "./ToolCallGroup.js";
|
|
10
11
|
import { SubAgentBlock } from "./SubAgentBlock.js";
|
|
11
12
|
import { ExecutionProgress } from "./ExecutionProgress.js";
|
|
12
13
|
import { ApprovalPrompt } from "./ApprovalPrompt.js";
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
14
|
+
import { FileReviewRecord } from "./FileReviewRecord.js";
|
|
15
|
+
/** A change set is "settled" once a decision has been folded (or reconcile failed). */
|
|
16
|
+
function isSettledSet(status) {
|
|
17
|
+
return (status === FileChangeSetStatus.DECIDED ||
|
|
18
|
+
status === FileChangeSetStatus.RECONCILED ||
|
|
19
|
+
status === FileChangeSetStatus.FAILED);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Builds the observational thread items for a single execution: the spec
|
|
23
|
+
* message, each AI/human message, tool-call groups, and sub-agent blocks —
|
|
24
|
+
* plus (when `includeFileReviewRecords`) a read-only settled record appended at
|
|
25
|
+
* the execution's tail for each decided/reconciled/failed change set.
|
|
26
|
+
*/
|
|
27
|
+
function buildExecutionSegment(exec, ei, includeFileReviewRecords) {
|
|
28
|
+
const seg = [];
|
|
29
|
+
const messages = exec.status?.messages ?? [];
|
|
30
|
+
const subAgents = exec.status?.subAgentExecutions ?? [];
|
|
31
|
+
const specMessage = exec.spec?.message;
|
|
32
|
+
if (specMessage && specMessage !== "execute") {
|
|
33
|
+
const humanMsg = create(AgentMessageSchema);
|
|
34
|
+
humanMsg.type = MessageType.MESSAGE_HUMAN;
|
|
35
|
+
humanMsg.content = specMessage;
|
|
36
|
+
seg.push({ kind: "message", message: humanMsg, key: `e${ei}-spec` });
|
|
37
|
+
}
|
|
38
|
+
for (let mi = 0; mi < messages.length; mi++) {
|
|
39
|
+
const msg = messages[mi];
|
|
40
|
+
if (msg.type === MessageType.MESSAGE_TOOL)
|
|
41
|
+
continue;
|
|
42
|
+
const isEmptyAi = msg.type === MessageType.MESSAGE_AI && !msg.content.trim();
|
|
43
|
+
if (!isEmptyAi) {
|
|
44
|
+
seg.push({ kind: "message", message: msg, key: `e${ei}-m${mi}` });
|
|
28
45
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
const
|
|
34
|
-
if (
|
|
35
|
-
|
|
46
|
+
if (msg.type === MessageType.MESSAGE_AI && msg.toolCalls.length > 0) {
|
|
47
|
+
// Split tool calls: "task" tools become sub-agent blocks,
|
|
48
|
+
// everything else goes into a regular tool group.
|
|
49
|
+
const regularTools = msg.toolCalls.filter((tc) => tc.name !== "task");
|
|
50
|
+
const taskTools = msg.toolCalls.filter((tc) => tc.name === "task");
|
|
51
|
+
if (regularTools.length > 0) {
|
|
52
|
+
seg.push({
|
|
53
|
+
kind: "tool-group",
|
|
54
|
+
toolCalls: regularTools,
|
|
55
|
+
key: `e${ei}-m${mi}-tc`,
|
|
56
|
+
});
|
|
36
57
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
kind: "tool-group",
|
|
45
|
-
toolCalls: regularTools,
|
|
46
|
-
key: `e${ei}-m${mi}-tc`,
|
|
58
|
+
for (let ti = 0; ti < taskTools.length; ti++) {
|
|
59
|
+
const matchedSub = subAgents.find((sa) => sa.id === taskTools[ti].id);
|
|
60
|
+
if (matchedSub) {
|
|
61
|
+
seg.push({
|
|
62
|
+
kind: "sub-agent",
|
|
63
|
+
subAgent: matchedSub,
|
|
64
|
+
key: `e${ei}-m${mi}-sa-${ti}`,
|
|
47
65
|
});
|
|
48
66
|
}
|
|
49
|
-
for (let ti = 0; ti < taskTools.length; ti++) {
|
|
50
|
-
const matchedSub = subAgents.find((sa) => sa.id === taskTools[ti].id);
|
|
51
|
-
if (matchedSub) {
|
|
52
|
-
items.push({
|
|
53
|
-
kind: "sub-agent",
|
|
54
|
-
subAgent: matchedSub,
|
|
55
|
-
key: `e${ei}-m${mi}-sa-${ti}`,
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
67
|
}
|
|
60
68
|
}
|
|
61
69
|
}
|
|
70
|
+
if (includeFileReviewRecords) {
|
|
71
|
+
// `displayFileChangeSets` returns the server projection for a live
|
|
72
|
+
// execution and folds the durable ledger for a terminal one, so a settled
|
|
73
|
+
// record renders for both. Appended at the segment tail (the terminal
|
|
74
|
+
// analogue of the web's last-stamped-row anchor); this is the only trace a
|
|
75
|
+
// shell-made set — which stamps no rows — leaves behind (DD-27 D2).
|
|
76
|
+
for (const set of displayFileChangeSets(exec.status)) {
|
|
77
|
+
if (!isSettledSet(set.status) || set.changes.length === 0)
|
|
78
|
+
continue;
|
|
79
|
+
seg.push({ kind: "file-review-record", set, key: `e${ei}-frr-${set.id}` });
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return seg;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Builds the full thread item list and the index at which the live region
|
|
86
|
+
* begins (`liveStart`).
|
|
87
|
+
*
|
|
88
|
+
* The split is by execution identity, not a trailing count: every completed
|
|
89
|
+
* execution's items are immutable history (safe for ink's append-only
|
|
90
|
+
* `<Static>`), while the active execution's items — plus the trailing transient
|
|
91
|
+
* items (phase, approvals, optimistic pending message) — stay live so their
|
|
92
|
+
* review badges can transition and the optimistic message can be cleared
|
|
93
|
+
* without shrinking the Static array.
|
|
94
|
+
*/
|
|
95
|
+
function buildThreadItems(executions, activeStreamExecution, pendingUserMessage, includeApprovals, includeFileReviewRecords) {
|
|
96
|
+
const items = [];
|
|
97
|
+
const allExecutions = activeStreamExecution
|
|
98
|
+
? [...executions, activeStreamExecution]
|
|
99
|
+
: executions;
|
|
100
|
+
// Boundary between immutable history and the live region. When there is an
|
|
101
|
+
// active execution, it is the item count right before that execution's
|
|
102
|
+
// segment; otherwise the transient tail (below) is the only live region.
|
|
103
|
+
let liveStart = 0;
|
|
104
|
+
let liveStartSet = false;
|
|
105
|
+
for (let ei = 0; ei < allExecutions.length; ei++) {
|
|
106
|
+
if (activeStreamExecution && ei === executions.length) {
|
|
107
|
+
liveStart = items.length;
|
|
108
|
+
liveStartSet = true;
|
|
109
|
+
}
|
|
110
|
+
items.push(...buildExecutionSegment(allExecutions[ei], ei, includeFileReviewRecords));
|
|
111
|
+
}
|
|
112
|
+
if (!liveStartSet) {
|
|
113
|
+
// No active execution: every execution body is history; only the transient
|
|
114
|
+
// tail appended below (e.g. an optimistic pending message) stays live.
|
|
115
|
+
liveStart = items.length;
|
|
116
|
+
}
|
|
117
|
+
// --- Transient tail (always live) ---
|
|
62
118
|
const lastExec = allExecutions[allExecutions.length - 1];
|
|
63
119
|
const lastPhase = lastExec?.status?.phase ?? ExecutionPhase.EXECUTION_PHASE_UNSPECIFIED;
|
|
64
120
|
if (isTerminalPhase(lastPhase) &&
|
|
@@ -85,47 +141,57 @@ function buildThreadItems(executions, activeStreamExecution, pendingUserMessage,
|
|
|
85
141
|
});
|
|
86
142
|
}
|
|
87
143
|
}
|
|
88
|
-
return items;
|
|
144
|
+
return { items, liveStart };
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Builds the id→change-set map that backs the file-review row badges, folding
|
|
148
|
+
* every execution's change sets (via `displayFileChangeSets`, which reads the
|
|
149
|
+
* live projection or the durable ledger). The active stream wins on an id
|
|
150
|
+
* collision so a live decision is reflected before it is persisted.
|
|
151
|
+
*/
|
|
152
|
+
function buildChangeSetsById(executions, activeStreamExecution) {
|
|
153
|
+
const changeSetsById = new Map();
|
|
154
|
+
for (const exec of executions) {
|
|
155
|
+
for (const set of displayFileChangeSets(exec.status)) {
|
|
156
|
+
changeSetsById.set(set.id, set);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
if (activeStreamExecution) {
|
|
160
|
+
for (const set of displayFileChangeSets(activeStreamExecution.status)) {
|
|
161
|
+
changeSetsById.set(set.id, set);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return { changeSetsById };
|
|
89
165
|
}
|
|
90
166
|
/**
|
|
91
167
|
* Renders a continuous conversation thread from one or more
|
|
92
168
|
* `AgentExecution` snapshots in the terminal.
|
|
93
169
|
*
|
|
94
|
-
* Composes {@link MessageEntry}, {@link ToolCallGroup},
|
|
95
|
-
* {@link ExecutionProgress},
|
|
96
|
-
* scrolling terminal log.
|
|
170
|
+
* Composes {@link MessageEntry}, {@link ToolCallGroup}, {@link SubAgentBlock},
|
|
171
|
+
* {@link ExecutionProgress}, {@link ApprovalPrompt}, and (for settled change
|
|
172
|
+
* sets) {@link FileReviewRecord} into a scrolling terminal log.
|
|
97
173
|
*
|
|
98
|
-
*
|
|
99
|
-
*
|
|
100
|
-
*
|
|
174
|
+
* Completed executions are rendered via Ink's `<Static>` component so they are
|
|
175
|
+
* written once and don't re-render, keeping terminal output efficient for long
|
|
176
|
+
* conversations. The active execution renders live so its file-review row
|
|
177
|
+
* badges transition (Pending review → Kept/Discarded) in place, then freeze
|
|
178
|
+
* into `<Static>` when the execution reaches a terminal phase. The thread is
|
|
179
|
+
* wrapped in a `FileReviewContext` provider so every {@link ToolCallItem}
|
|
180
|
+
* can badge its stamped edit rows.
|
|
101
181
|
*/
|
|
102
|
-
export function MessageThread({ executions, activeStreamExecution, pendingUserMessage, onApprovalSubmit, submittingApprovalIds, expandToolCalls = false, }) {
|
|
182
|
+
export function MessageThread({ executions, activeStreamExecution, pendingUserMessage, onApprovalSubmit, submittingApprovalIds, expandToolCalls = false, showFileReviewRecords = false, }) {
|
|
103
183
|
const includeApprovals = onApprovalSubmit != null;
|
|
104
|
-
const items = useMemo(() => buildThreadItems(executions, activeStreamExecution, pendingUserMessage, includeApprovals), [
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
item.kind === "phase") {
|
|
116
|
-
count++;
|
|
117
|
-
}
|
|
118
|
-
else if (item.kind === "message" &&
|
|
119
|
-
item.message.type === MessageType.MESSAGE_AI &&
|
|
120
|
-
item.message.isStreaming) {
|
|
121
|
-
count++;
|
|
122
|
-
break;
|
|
123
|
-
}
|
|
124
|
-
else {
|
|
125
|
-
break;
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
return count;
|
|
184
|
+
const { items, liveStart } = useMemo(() => buildThreadItems(executions, activeStreamExecution, pendingUserMessage, includeApprovals, showFileReviewRecords), [
|
|
185
|
+
executions,
|
|
186
|
+
activeStreamExecution,
|
|
187
|
+
pendingUserMessage,
|
|
188
|
+
includeApprovals,
|
|
189
|
+
showFileReviewRecords,
|
|
190
|
+
]);
|
|
191
|
+
const fileReviewContext = useMemo(() => buildChangeSetsById(executions, activeStreamExecution), [executions, activeStreamExecution]);
|
|
192
|
+
const historyItems = items.slice(0, liveStart);
|
|
193
|
+
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)))] }) }));
|
|
129
195
|
}
|
|
130
196
|
function renderItem(item, onApprovalSubmit, submittingApprovalIds, expandToolCalls) {
|
|
131
197
|
switch (item.kind) {
|
|
@@ -137,6 +203,8 @@ function renderItem(item, onApprovalSubmit, submittingApprovalIds, expandToolCal
|
|
|
137
203
|
return _jsx(SubAgentBlock, { subAgent: item.subAgent, defaultExpanded: expandToolCalls });
|
|
138
204
|
case "phase":
|
|
139
205
|
return _jsx(ExecutionProgress, { phase: item.phase });
|
|
206
|
+
case "file-review-record":
|
|
207
|
+
return _jsx(FileReviewRecord, { fileChangeSet: item.set });
|
|
140
208
|
case "approval":
|
|
141
209
|
return onApprovalSubmit ? (_jsx(ApprovalPrompt, { pendingApproval: item.pendingApproval, onSubmit: (action) => onApprovalSubmit(item.pendingApproval.toolCallId, action), isSubmitting: submittingApprovalIds?.has(item.pendingApproval.toolCallId) ?? false })) : null;
|
|
142
210
|
case "pending-message":
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageThread.js","sourceRoot":"","sources":["../../src/components/MessageThread.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAM5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,iEAAiE,CAAC;
|
|
1
|
+
{"version":3,"file":"MessageThread.js","sourceRoot":"","sources":["../../src/components/MessageThread.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolCallGroup.d.ts","sourceRoot":"","sources":["../../src/components/ToolCallGroup.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iEAAiE,CAAC;
|
|
1
|
+
{"version":3,"file":"ToolCallGroup.d.ts","sourceRoot":"","sources":["../../src/components/ToolCallGroup.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iEAAiE,CAAC;AAUhG,uCAAuC;AACvC,MAAM,WAAW,kBAAkB;IACjC,4DAA4D;IAC5D,QAAQ,CAAC,SAAS,EAAE,SAAS,QAAQ,EAAE,CAAC;IACxC,wEAAwE;IACxE,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,0EAA0E;IAC1E,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;CACpC;AAqED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,EAC5B,SAAS,EACT,SAAiB,EACjB,eAAuB,GACxB,EAAE,kBAAkB,2CAuCpB"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useState } from "react";
|
|
2
|
+
import { useContext, useState } from "react";
|
|
3
3
|
import { Box, Text, useInput } from "ink";
|
|
4
4
|
import { ToolCallStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
5
|
+
import { FileReviewContext, fileReviewRowState, extractPrimaryArg, } from "@stigmer/react";
|
|
5
6
|
import { ToolCallItem } from "./ToolCallItem.js";
|
|
6
7
|
function deriveAggregateStatus(toolCalls) {
|
|
7
8
|
let hasRunning = false;
|
|
@@ -26,6 +27,44 @@ const STATUS_STYLE = {
|
|
|
26
27
|
failed: { symbol: "✗", color: "red" },
|
|
27
28
|
pending: { symbol: "○" },
|
|
28
29
|
};
|
|
30
|
+
/**
|
|
31
|
+
* A compact file-review cue for the collapsed summary line, so a pending edit is
|
|
32
|
+
* visible without expanding the group. Folds the group's stamped edit rows via
|
|
33
|
+
* the same pure {@link fileReviewRowState} the per-row badges use, reading the
|
|
34
|
+
* change sets from {@link FileReviewContext}. Pending takes precedence (it is
|
|
35
|
+
* the actionable state); otherwise a settled group shows its kept/discarded
|
|
36
|
+
* tally. Returns `null` when no row in the group is stamped.
|
|
37
|
+
*/
|
|
38
|
+
function useReviewCue(toolCalls) {
|
|
39
|
+
const { changeSetsById } = useContext(FileReviewContext);
|
|
40
|
+
const counts = {
|
|
41
|
+
pending: 0,
|
|
42
|
+
kept: 0,
|
|
43
|
+
discarded: 0,
|
|
44
|
+
failed: 0,
|
|
45
|
+
};
|
|
46
|
+
for (const tc of toolCalls) {
|
|
47
|
+
if (!tc.fileChangeSetId)
|
|
48
|
+
continue;
|
|
49
|
+
const state = fileReviewRowState(changeSetsById.get(tc.fileChangeSetId), extractPrimaryArg(tc));
|
|
50
|
+
if (state)
|
|
51
|
+
counts[state]++;
|
|
52
|
+
}
|
|
53
|
+
if (counts.pending > 0) {
|
|
54
|
+
return { label: `${counts.pending} pending review`, color: "yellow" };
|
|
55
|
+
}
|
|
56
|
+
if (counts.failed > 0) {
|
|
57
|
+
return { label: `${counts.failed} review failed`, color: "red" };
|
|
58
|
+
}
|
|
59
|
+
const settled = [];
|
|
60
|
+
if (counts.kept > 0)
|
|
61
|
+
settled.push(`${counts.kept} kept`);
|
|
62
|
+
if (counts.discarded > 0)
|
|
63
|
+
settled.push(`${counts.discarded} discarded`);
|
|
64
|
+
if (settled.length > 0)
|
|
65
|
+
return { label: settled.join(" · "), color: "gray" };
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
29
68
|
/**
|
|
30
69
|
* Renders a collapsible group of tool calls with an aggregate status.
|
|
31
70
|
*
|
|
@@ -38,6 +77,7 @@ export function ToolCallGroup({ toolCalls, isFocused = false, defaultExpanded =
|
|
|
38
77
|
const [expanded, setExpanded] = useState(defaultExpanded);
|
|
39
78
|
const status = deriveAggregateStatus(toolCalls);
|
|
40
79
|
const style = STATUS_STYLE[status];
|
|
80
|
+
const reviewCue = useReviewCue(toolCalls);
|
|
41
81
|
useInput((_input, key) => {
|
|
42
82
|
if (key.return || _input === " ") {
|
|
43
83
|
setExpanded((prev) => !prev);
|
|
@@ -46,6 +86,6 @@ export function ToolCallGroup({ toolCalls, isFocused = false, defaultExpanded =
|
|
|
46
86
|
const summary = toolCalls.length === 1
|
|
47
87
|
? toolCalls[0].name
|
|
48
88
|
: `${toolCalls.length} tool calls`;
|
|
49
|
-
return (_jsxs(Box, { flexDirection: "column", paddingLeft: 2, children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { color: style.color, children: style.symbol }), _jsx(Text, { dimColor: true, children: expanded ? "▼" : "▶" }), _jsx(Text, { children: summary })] }), expanded && (_jsx(Box, { flexDirection: "column", paddingLeft: 2, marginTop: 1, children: toolCalls.map((tc) => (_jsx(ToolCallItem, { toolCall: tc, expanded: true }, tc.id))) }))] }));
|
|
89
|
+
return (_jsxs(Box, { flexDirection: "column", paddingLeft: 2, children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { color: style.color, children: style.symbol }), _jsx(Text, { dimColor: true, children: expanded ? "▼" : "▶" }), _jsx(Text, { children: summary }), reviewCue && (_jsxs(Text, { color: reviewCue.color, children: ["\u00B7 ", reviewCue.label] }))] }), expanded && (_jsx(Box, { flexDirection: "column", paddingLeft: 2, marginTop: 1, children: toolCalls.map((tc) => (_jsx(ToolCallItem, { toolCall: tc, expanded: true }, tc.id))) }))] }));
|
|
50
90
|
}
|
|
51
91
|
//# sourceMappingURL=ToolCallGroup.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolCallGroup.js","sourceRoot":"","sources":["../../src/components/ToolCallGroup.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"ToolCallGroup.js","sourceRoot":"","sources":["../../src/components/ToolCallGroup.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolCallItem.d.ts","sourceRoot":"","sources":["../../src/components/ToolCallItem.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iEAAiE,CAAC;
|
|
1
|
+
{"version":3,"file":"ToolCallItem.d.ts","sourceRoot":"","sources":["../../src/components/ToolCallItem.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iEAAiE,CAAC;AAUhG,sCAAsC;AACtC,MAAM,WAAW,iBAAiB;IAChC,+BAA+B;IAC/B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,4DAA4D;IAC5D,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAmCD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,QAAgB,EAAE,EAAE,iBAAiB,2CA+C7E"}
|
|
@@ -2,6 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { Box, Text } from "ink";
|
|
3
3
|
import { ToolCallStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
4
4
|
import { ToolKind, resolveToolKind, normalizeToolResult } from "@stigmer/sdk";
|
|
5
|
+
import { extractPrimaryArg, useFileReviewRowState, } from "@stigmer/react";
|
|
5
6
|
const STATUS_INDICATOR = {
|
|
6
7
|
[ToolCallStatus.TOOL_CALL_RUNNING]: { symbol: "⠋", color: "yellow" },
|
|
7
8
|
[ToolCallStatus.TOOL_CALL_COMPLETED]: { symbol: "✓", color: "green" },
|
|
@@ -24,6 +25,14 @@ const KIND_LABEL = {
|
|
|
24
25
|
[ToolKind.TODO]: "Todos",
|
|
25
26
|
[ToolKind.SUBAGENT]: "Sub-agent",
|
|
26
27
|
};
|
|
28
|
+
// File-review row badges, mirroring the web console's per-row badge labels and
|
|
29
|
+
// tones. Keyed by the shared `fileReviewRowState` classification.
|
|
30
|
+
const REVIEW_BADGE = {
|
|
31
|
+
pending: { label: "Pending review", color: "yellow" },
|
|
32
|
+
kept: { label: "Kept", color: "green" },
|
|
33
|
+
discarded: { label: "Discarded", color: "red" },
|
|
34
|
+
failed: { label: "Review failed", color: "red" },
|
|
35
|
+
};
|
|
27
36
|
/**
|
|
28
37
|
* Renders a single tool call with a status indicator, label, and an optional
|
|
29
38
|
* expanded result. Labels and results come from the shared `@stigmer/sdk` view
|
|
@@ -36,7 +45,13 @@ export function ToolCallItem({ toolCall, expanded = false }) {
|
|
|
36
45
|
const label = toolLabel(toolCall, kind);
|
|
37
46
|
const view = normalizeToolResult(toolCall);
|
|
38
47
|
const resultText = expanded ? describeResultView(view) : null;
|
|
39
|
-
|
|
48
|
+
// A flowed file edit stamped with its change set id badges the set's live
|
|
49
|
+
// review state right on the row (the observational record stays in place; the
|
|
50
|
+
// decision surface is the docked FileReviewPrompt). Null for unstamped rows
|
|
51
|
+
// and honest-degradation cases (missing/capturing set, superseded edit).
|
|
52
|
+
const reviewState = useFileReviewRowState(toolCall.fileChangeSetId, extractPrimaryArg(toolCall));
|
|
53
|
+
const reviewBadge = reviewState ? REVIEW_BADGE[reviewState] : null;
|
|
54
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { color: indicator.color, children: indicator.symbol }), _jsx(Text, { children: label }), toolCall.status === ToolCallStatus.TOOL_CALL_RUNNING && (_jsx(Text, { dimColor: true, children: "running" })), reviewBadge && _jsx(Text, { color: reviewBadge.color, children: reviewBadge.label })] }), view.type === "error" ? (expanded && (_jsx(Box, { paddingLeft: 3, children: _jsx(Text, { color: "red", wrap: "truncate-end", children: view.message }) }))) : (resultText && (_jsx(Box, { paddingLeft: 3, children: _jsx(Text, { dimColor: true, wrap: "truncate-end", children: resultText }) })))] }));
|
|
40
55
|
}
|
|
41
56
|
function toolLabel(toolCall, kind) {
|
|
42
57
|
if (toolCall.mcpServerSlug) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolCallItem.js","sourceRoot":"","sources":["../../src/components/ToolCallItem.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,OAAO,EAAE,cAAc,EAAE,MAAM,8DAA8D,CAAC;AAC9F,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"ToolCallItem.js","sourceRoot":"","sources":["../../src/components/ToolCallItem.tsx"],"names":[],"mappings":"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"}
|
package/file-review.d.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { CapturedFileChange, FileChangeSet } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/filereview_pb";
|
|
2
|
+
import { FileChangeKind } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
3
|
+
/**
|
|
4
|
+
* Single-letter badge for a file change's kind, matching the web review card:
|
|
5
|
+
* `A` added, `M` modified, `D` deleted, `R` renamed. A binary change reads as
|
|
6
|
+
* `M` — "binary" is a review-completeness property (from `FileContent.is_binary`
|
|
7
|
+
* via `fileReviewability`), not a distinct edit kind.
|
|
8
|
+
*/
|
|
9
|
+
export declare function kindLetter(kind: FileChangeKind): string;
|
|
10
|
+
/**
|
|
11
|
+
* The path to show for a change: the post-edit path, or the pre-edit path for a
|
|
12
|
+
* deletion. A rename shows `before → after` so both sides are visible.
|
|
13
|
+
*/
|
|
14
|
+
export declare function changeDisplayPath(change: CapturedFileChange): string;
|
|
15
|
+
/**
|
|
16
|
+
* The honest, one-line reason a change cannot be kept as-is, or `null` when it
|
|
17
|
+
* is fully reviewable. Mirrors the web card's per-file block-reason copy so the
|
|
18
|
+
* terminal reviewer sees the same explanation.
|
|
19
|
+
*/
|
|
20
|
+
export declare function blockReasonNote(change: CapturedFileChange): string | null;
|
|
21
|
+
/** The effective per-file verdict counts for a settled change set. */
|
|
22
|
+
export interface SettledCounts {
|
|
23
|
+
/** Files kept (effective verdict APPROVE). */
|
|
24
|
+
readonly kept: number;
|
|
25
|
+
/** Files discarded (effective verdict REJECT). */
|
|
26
|
+
readonly discarded: number;
|
|
27
|
+
/** Files with no effective verdict (neither kept nor discarded). */
|
|
28
|
+
readonly notReviewed: number;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Folds a settled change set's decisions into kept / discarded / not-reviewed
|
|
32
|
+
* counts, using the same `deriveEffectiveVerdicts` fold the web uses so a
|
|
33
|
+
* "Keep all" set correctly reads every file as kept.
|
|
34
|
+
*/
|
|
35
|
+
export declare function settledCounts(set: FileChangeSet): SettledCounts;
|
|
36
|
+
/**
|
|
37
|
+
* A one-line summary of a settled change set's outcome, e.g. `2 kept · 1
|
|
38
|
+
* discarded`, or `3 files changed` when nothing was individually decided.
|
|
39
|
+
*/
|
|
40
|
+
export declare function settledSummary(set: FileChangeSet): string;
|
|
41
|
+
//# sourceMappingURL=file-review.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-review.d.ts","sourceRoot":"","sources":["../src/file-review.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,aAAa,EACd,MAAM,oEAAoE,CAAC;AAC5E,OAAO,EACL,cAAc,EAEf,MAAM,8DAA8D,CAAC;AAGtE;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAWvD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAKpE;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,GAAG,IAAI,CAiBzE;AAED,sEAAsE;AACtE,MAAM,WAAW,aAAa;IAC5B,8CAA8C;IAC9C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,kDAAkD;IAClD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,oEAAoE;IACpE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,aAAa,GAAG,aAAa,CAc/D;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CASzD"}
|
package/file-review.js
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { FileChangeKind, FileDecisionAction, } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
2
|
+
import { deriveEffectiveVerdicts, fileReviewability } from "@stigmer/react";
|
|
3
|
+
/**
|
|
4
|
+
* Single-letter badge for a file change's kind, matching the web review card:
|
|
5
|
+
* `A` added, `M` modified, `D` deleted, `R` renamed. A binary change reads as
|
|
6
|
+
* `M` — "binary" is a review-completeness property (from `FileContent.is_binary`
|
|
7
|
+
* via `fileReviewability`), not a distinct edit kind.
|
|
8
|
+
*/
|
|
9
|
+
export function kindLetter(kind) {
|
|
10
|
+
switch (kind) {
|
|
11
|
+
case FileChangeKind.ADD:
|
|
12
|
+
return "A";
|
|
13
|
+
case FileChangeKind.DELETE:
|
|
14
|
+
return "D";
|
|
15
|
+
case FileChangeKind.RENAME:
|
|
16
|
+
return "R";
|
|
17
|
+
default:
|
|
18
|
+
return "M";
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* The path to show for a change: the post-edit path, or the pre-edit path for a
|
|
23
|
+
* deletion. A rename shows `before → after` so both sides are visible.
|
|
24
|
+
*/
|
|
25
|
+
export function changeDisplayPath(change) {
|
|
26
|
+
if (change.kind === FileChangeKind.RENAME && change.pathBefore && change.pathAfter) {
|
|
27
|
+
return `${change.pathBefore} → ${change.pathAfter}`;
|
|
28
|
+
}
|
|
29
|
+
return change.pathAfter || change.pathBefore;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* The honest, one-line reason a change cannot be kept as-is, or `null` when it
|
|
33
|
+
* is fully reviewable. Mirrors the web card's per-file block-reason copy so the
|
|
34
|
+
* terminal reviewer sees the same explanation.
|
|
35
|
+
*/
|
|
36
|
+
export function blockReasonNote(change) {
|
|
37
|
+
const reviewability = fileReviewability(change);
|
|
38
|
+
switch (reviewability.kind) {
|
|
39
|
+
case "reviewable":
|
|
40
|
+
return null;
|
|
41
|
+
case "binary":
|
|
42
|
+
return "binary — no text diff; keep as-is or discard";
|
|
43
|
+
case "unavailable":
|
|
44
|
+
switch (reviewability.reason) {
|
|
45
|
+
case "secret":
|
|
46
|
+
return "contents withheld (looks like a secret) — discard only";
|
|
47
|
+
case "size":
|
|
48
|
+
return "diff too large to display — discard only";
|
|
49
|
+
default:
|
|
50
|
+
return "diff unavailable — discard only";
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Folds a settled change set's decisions into kept / discarded / not-reviewed
|
|
56
|
+
* counts, using the same `deriveEffectiveVerdicts` fold the web uses so a
|
|
57
|
+
* "Keep all" set correctly reads every file as kept.
|
|
58
|
+
*/
|
|
59
|
+
export function settledCounts(set) {
|
|
60
|
+
const verdicts = deriveEffectiveVerdicts(set);
|
|
61
|
+
let kept = 0;
|
|
62
|
+
let discarded = 0;
|
|
63
|
+
for (const change of set.changes) {
|
|
64
|
+
const verdict = verdicts.get(change.id);
|
|
65
|
+
if (verdict === FileDecisionAction.APPROVE)
|
|
66
|
+
kept++;
|
|
67
|
+
else if (verdict === FileDecisionAction.REJECT)
|
|
68
|
+
discarded++;
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
kept,
|
|
72
|
+
discarded,
|
|
73
|
+
notReviewed: set.changes.length - kept - discarded,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* A one-line summary of a settled change set's outcome, e.g. `2 kept · 1
|
|
78
|
+
* discarded`, or `3 files changed` when nothing was individually decided.
|
|
79
|
+
*/
|
|
80
|
+
export function settledSummary(set) {
|
|
81
|
+
const { kept, discarded, notReviewed } = settledCounts(set);
|
|
82
|
+
const parts = [];
|
|
83
|
+
if (kept)
|
|
84
|
+
parts.push(`${kept} kept`);
|
|
85
|
+
if (discarded)
|
|
86
|
+
parts.push(`${discarded} discarded`);
|
|
87
|
+
if (notReviewed)
|
|
88
|
+
parts.push(`${notReviewed} not reviewed`);
|
|
89
|
+
if (parts.length > 0)
|
|
90
|
+
return parts.join(" · ");
|
|
91
|
+
const n = set.changes.length;
|
|
92
|
+
return `${n} file${n === 1 ? "" : "s"} changed`;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=file-review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-review.js","sourceRoot":"","sources":["../src/file-review.ts"],"names":[],"mappings":"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"}
|