@agents-ensemble/cli 0.12.0 → 0.14.0

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.
Files changed (57) hide show
  1. package/README.md +3 -0
  2. package/dist/format-session-summary.d.ts.map +1 -1
  3. package/dist/format-session-summary.js +74 -7
  4. package/dist/format-session-summary.js.map +1 -1
  5. package/dist/index.js +14 -0
  6. package/dist/index.js.map +1 -1
  7. package/dist/tui/format-operator-context.d.ts +2 -3
  8. package/dist/tui/format-operator-context.d.ts.map +1 -1
  9. package/dist/tui/format-operator-context.js +6 -12
  10. package/dist/tui/format-operator-context.js.map +1 -1
  11. package/dist/tui/ink-test-keys.d.ts +1 -0
  12. package/dist/tui/ink-test-keys.d.ts.map +1 -1
  13. package/dist/tui/ink-test-keys.js +1 -0
  14. package/dist/tui/ink-test-keys.js.map +1 -1
  15. package/dist/tui/issue-session-tui-stream-cursor.test.js +58 -11
  16. package/dist/tui/issue-session-tui-stream-cursor.test.js.map +1 -1
  17. package/dist/tui/issue-session-tui-stream.d.ts.map +1 -1
  18. package/dist/tui/issue-session-tui-stream.js +86 -7
  19. package/dist/tui/issue-session-tui-stream.js.map +1 -1
  20. package/dist/tui/issue-session-tui-stream.test.js +147 -21
  21. package/dist/tui/issue-session-tui-stream.test.js.map +1 -1
  22. package/dist/tui/issue-session-tui.d.ts.map +1 -1
  23. package/dist/tui/issue-session-tui.js +90 -9
  24. package/dist/tui/issue-session-tui.js.map +1 -1
  25. package/dist/tui/issue-session-tui.test.js +280 -54
  26. package/dist/tui/issue-session-tui.test.js.map +1 -1
  27. package/dist/tui/open-question-answer-suggestions.d.ts +19 -0
  28. package/dist/tui/open-question-answer-suggestions.d.ts.map +1 -0
  29. package/dist/tui/open-question-answer-suggestions.js +62 -0
  30. package/dist/tui/open-question-answer-suggestions.js.map +1 -0
  31. package/dist/tui/operator-command-suggestions.d.ts +13 -1
  32. package/dist/tui/operator-command-suggestions.d.ts.map +1 -1
  33. package/dist/tui/operator-command-suggestions.js +23 -2
  34. package/dist/tui/operator-command-suggestions.js.map +1 -1
  35. package/dist/tui/operator-text-area.d.ts +9 -2
  36. package/dist/tui/operator-text-area.d.ts.map +1 -1
  37. package/dist/tui/operator-text-area.js +5 -2
  38. package/dist/tui/operator-text-area.js.map +1 -1
  39. package/dist/tui/operator-text-area.test-double.d.ts +1 -1
  40. package/dist/tui/operator-text-area.test-double.d.ts.map +1 -1
  41. package/dist/tui/operator-text-area.test-double.js +87 -6
  42. package/dist/tui/operator-text-area.test-double.js.map +1 -1
  43. package/dist/tui/operator-text-area.test-stub.d.ts +5 -1
  44. package/dist/tui/operator-text-area.test-stub.d.ts.map +1 -1
  45. package/dist/tui/operator-text-area.test-stub.js +6 -2
  46. package/dist/tui/operator-text-area.test-stub.js.map +1 -1
  47. package/dist/tui/operator-text-area.test.js +13 -0
  48. package/dist/tui/operator-text-area.test.js.map +1 -1
  49. package/dist/tui/tui-layout-constants.d.ts +3 -5
  50. package/dist/tui/tui-layout-constants.d.ts.map +1 -1
  51. package/dist/tui/tui-layout-constants.js +3 -5
  52. package/dist/tui/tui-layout-constants.js.map +1 -1
  53. package/dist/tui/worker-display-name.d.ts +2 -0
  54. package/dist/tui/worker-display-name.d.ts.map +1 -0
  55. package/dist/tui/worker-display-name.js +4 -0
  56. package/dist/tui/worker-display-name.js.map +1 -0
  57. package/package.json +3 -2
@@ -3,9 +3,10 @@ import { Box, Static, Text, useInput } from 'ink';
3
3
  import { useCallback, useEffect, useMemo, useState, useSyncExternalStore, } from 'react';
4
4
  import { getTuiOpenQuestions } from './tui-view-model.js';
5
5
  import { advanceOpenQuestionSelection, clampOpenQuestionSelectionIndex, resolveOpenQuestionsPaneLayout, } from './open-questions-pane.js';
6
- import { INPUT_PANE_TITLE, INPUT_PANE_BORDER_COLOR, INPUT_PANE_HINT_COLOR, PANE_PADDING_X, ROUND_BORDER_WIDTH, } from './tui-layout-constants.js';
6
+ import { INPUT_PANE_TITLE, INPUT_PANE_BORDER_COLOR, INPUT_PANE_HINT_COLOR, OPERATOR_INPUT_PROMPT, PANE_PADDING_X, ROUND_BORDER_WIDTH, } from './tui-layout-constants.js';
7
7
  import { OperatorTextArea } from './operator-text-area.js';
8
- import { getOperatorCommandSuggestionLines } from './operator-command-suggestions.js';
8
+ import { advanceOperatorCommandSelection, getOperatorCommandSuggestionLines, getOperatorCommandSuggestions, } from './operator-command-suggestions.js';
9
+ import { advanceOpenQuestionAnswerSuggestionSelection, getOpenQuestionAnswerSuggestionLines, getOpenQuestionAnswerSuggestions, } from './open-question-answer-suggestions.js';
9
10
  import { ActivityLogDisplayLineRow, OpenQuestionsPane, WorkerStatusPane, WrappedTextLines, } from './issue-session-tui.js';
10
11
  import { computeInputPaneHeight, computeOperatorInputCursorX, computeStreamOperatorInputCursorY, } from './compute-operator-input-cursor-y.js';
11
12
  import { computeMaxInputDisplayLines, trimBlankLinesOnly } from './operator-input-layout.js';
@@ -32,14 +33,18 @@ function StaticActivityLog({ activityLog, contentWidth, replayGeneration, issueL
32
33
  export function IssueSessionTuiStream({ viewModel, onSubmit, issueUrl, issueLinkMode = 'osc8', terminalSizeStore, scrollbackEvent, }) {
33
34
  const snapshot = useSyncExternalStore(viewModel.subscribe, viewModel.getSnapshot, viewModel.getSnapshot);
34
35
  const [inputValue, setInputValue] = useState('');
36
+ const [inputCursorPosition, setInputCursorPosition] = useState([0, 0]);
35
37
  const [inputDisplayLineCount, setInputDisplayLineCount] = useState(1);
38
+ const [selectedCommandIndex, setSelectedCommandIndex] = useState(0);
39
+ const [selectedAnswerSuggestionIndex, setSelectedAnswerSuggestionIndex] = useState(0);
36
40
  const [selectedQuestionIndex, setSelectedQuestionIndex] = useState(0);
41
+ const [hiddenAnswerSuggestionQuestionId, setHiddenAnswerSuggestionQuestionId] = useState();
37
42
  const [scrollbackState, setScrollbackState] = useState(() => createStreamScrollbackState(snapshot.activityLog.length));
38
43
  const terminalSize = useTuiTerminalSize(terminalSizeStore);
39
44
  const { columns: terminalColumns, rows: terminalRows } = terminalSize;
40
45
  const contentWidth = useStreamContentWidth(terminalColumns);
41
46
  const activityLogContentWidth = useStreamActivityLogWidth(terminalColumns);
42
- const operatorPrompt = 'operator> ';
47
+ const operatorPrompt = OPERATOR_INPUT_PROMPT;
43
48
  const maxInputDisplayLines = computeMaxInputDisplayLines(terminalRows);
44
49
  const openQuestions = getTuiOpenQuestions(snapshot);
45
50
  const openQuestionsLayout = useMemo(() => resolveOpenQuestionsPaneLayout({
@@ -49,7 +54,8 @@ export function IssueSessionTuiStream({ viewModel, onSubmit, issueUrl, issueLink
49
54
  terminalRows,
50
55
  }), [openQuestions, selectedQuestionIndex, contentWidth, terminalRows]);
51
56
  const selectedQuestion = openQuestions[openQuestionsLayout.selectedIndex];
52
- const commandSuggestionLines = getOperatorCommandSuggestionLines(inputValue, contentWidth);
57
+ const commandSuggestions = getOperatorCommandSuggestions(inputValue);
58
+ const commandSuggestionLines = getOperatorCommandSuggestionLines(inputValue, contentWidth, selectedCommandIndex);
53
59
  const operatorInputDisplay = resolveOperatorInputDisplayMode({
54
60
  openQuestions,
55
61
  selection: selectedQuestion
@@ -59,9 +65,16 @@ export function IssueSessionTuiStream({ viewModel, onSubmit, issueUrl, issueLink
59
65
  total: openQuestions.length,
60
66
  }
61
67
  : undefined,
62
- postLoopWaiting: snapshot.postLoopWaiting,
63
68
  shuttingDown: snapshot.shuttingDown,
64
69
  });
70
+ const isSlashInput = /^[\t ]*\//u.test(inputValue);
71
+ const answerSuggestions = operatorInputDisplay.mode === 'withQuestions' &&
72
+ !snapshot.shuttingDown &&
73
+ !isSlashInput &&
74
+ selectedQuestion?.id !== hiddenAnswerSuggestionQuestionId
75
+ ? getOpenQuestionAnswerSuggestions(inputValue, selectedQuestion)
76
+ : [];
77
+ const answerSuggestionLines = getOpenQuestionAnswerSuggestionLines(answerSuggestions, contentWidth, selectedAnswerSuggestionIndex);
65
78
  const committedActivityCount = Math.min(scrollbackState.detached
66
79
  ? scrollbackState.committedActivityCount
67
80
  : snapshot.activityLog.length, snapshot.activityLog.length);
@@ -75,7 +88,7 @@ export function IssueSessionTuiStream({ viewModel, onSubmit, issueUrl, issueLink
75
88
  ? [scrollbackHint, ...operatorInputDisplay.hintLines]
76
89
  : operatorInputDisplay.hintLines;
77
90
  const visibleInputDisplayLineCount = Math.min(inputDisplayLineCount, maxInputDisplayLines);
78
- const hintLineCount = contextHintLines.reduce((lineCount, line) => lineCount + wrapTextToWidth(line, contentWidth).length, commandSuggestionLines.length);
91
+ const hintLineCount = contextHintLines.reduce((lineCount, line) => lineCount + wrapTextToWidth(line, contentWidth).length, commandSuggestionLines.length + answerSuggestionLines.length);
79
92
  const desiredInputPaneHeight = computeInputPaneHeight({
80
93
  hintLineCount,
81
94
  inputDisplayLineCount: visibleInputDisplayLineCount,
@@ -103,6 +116,9 @@ export function IssueSessionTuiStream({ viewModel, onSubmit, issueUrl, issueLink
103
116
  useEffect(() => {
104
117
  setSelectedQuestionIndex((current) => clampOpenQuestionSelectionIndex(current, openQuestions.length));
105
118
  }, [openQuestions]);
119
+ useEffect(() => {
120
+ setSelectedAnswerSuggestionIndex(0);
121
+ }, [selectedQuestion?.id]);
106
122
  useEffect(() => {
107
123
  if (!scrollbackEvent) {
108
124
  return;
@@ -125,6 +141,26 @@ export function IssueSessionTuiStream({ viewModel, onSubmit, issueUrl, issueLink
125
141
  return;
126
142
  }
127
143
  }
144
+ if (commandSuggestions.length > 0) {
145
+ if (key.upArrow) {
146
+ setSelectedCommandIndex((current) => advanceOperatorCommandSelection(current, 'up', commandSuggestions.length));
147
+ return;
148
+ }
149
+ if (key.downArrow) {
150
+ setSelectedCommandIndex((current) => advanceOperatorCommandSelection(current, 'down', commandSuggestions.length));
151
+ return;
152
+ }
153
+ }
154
+ if (answerSuggestions.length > 0) {
155
+ if (key.upArrow) {
156
+ setSelectedAnswerSuggestionIndex((current) => advanceOpenQuestionAnswerSuggestionSelection(current, 'up', answerSuggestions.length));
157
+ return;
158
+ }
159
+ if (key.downArrow) {
160
+ setSelectedAnswerSuggestionIndex((current) => advanceOpenQuestionAnswerSuggestionSelection(current, 'down', answerSuggestions.length));
161
+ return;
162
+ }
163
+ }
128
164
  const scrollWithModifier = key.ctrl;
129
165
  const scrollWithoutModifier = inputValue.length === 0;
130
166
  if (!scrollWithModifier && !scrollWithoutModifier) {
@@ -138,10 +174,25 @@ export function IssueSessionTuiStream({ viewModel, onSubmit, issueUrl, issueLink
138
174
  dispatchScrollbackEvent({ type: 'follow', source: 'keyboard' });
139
175
  }
140
176
  });
177
+ const applyAnswerSuggestion = () => {
178
+ const selectedSuggestion = answerSuggestions[selectedAnswerSuggestionIndex];
179
+ if (!selectedQuestion || !selectedSuggestion) {
180
+ return;
181
+ }
182
+ setInputValue(selectedSuggestion.value);
183
+ setInputCursorPosition([0, selectedSuggestion.value.length]);
184
+ setHiddenAnswerSuggestionQuestionId(selectedQuestion.id);
185
+ setSelectedAnswerSuggestionIndex(0);
186
+ setInputDisplayLineCount(1);
187
+ };
141
188
  const handleSubmit = (value) => {
142
189
  if (snapshot.shuttingDown) {
143
190
  return;
144
191
  }
192
+ if (answerSuggestions.length > 0) {
193
+ applyAnswerSuggestion();
194
+ return;
195
+ }
145
196
  const trimmed = trimBlankLinesOnly(value);
146
197
  if (!trimmed) {
147
198
  return;
@@ -150,8 +201,36 @@ export function IssueSessionTuiStream({ viewModel, onSubmit, issueUrl, issueLink
150
201
  ? { targetOpenQuestionId: selectedQuestion.id }
151
202
  : undefined);
152
203
  setInputValue('');
204
+ setInputCursorPosition([0, 0]);
205
+ setSelectedCommandIndex(0);
206
+ setSelectedAnswerSuggestionIndex(0);
207
+ setHiddenAnswerSuggestionQuestionId(undefined);
153
208
  setInputDisplayLineCount(1);
154
209
  };
155
- return (_jsxs(_Fragment, { children: [_jsx(StaticActivityLog, { activityLog: snapshot.activityLog.slice(0, committedActivityCount), contentWidth: activityLogContentWidth, replayGeneration: snapshot.activityLogGeneration, issueLinkMode: issueLinkMode }), _jsxs(Box, { flexDirection: "column", width: terminalColumns, height: streamPaneHeights.dynamicFrameHeight, overflowX: "visible", overflowY: "hidden", children: [operatorInputDisplay.mode === 'withQuestions' ? (_jsx(OpenQuestionsPane, { layout: streamOpenQuestionsLayout, terminalColumns: terminalColumns, issueLinkMode: issueLinkMode })) : null, _jsxs(TitledBorderPane, { title: INPUT_PANE_TITLE, borderStyle: "single", borderColor: INPUT_PANE_BORDER_COLOR, paddingX: PANE_PADDING_X, height: streamPaneHeights.inputPaneHeight, terminalColumns: terminalColumns, children: [contextHintLines.map((line, index) => (_jsx(WrappedTextLines, { text: line, width: contentWidth, color: INPUT_PANE_HINT_COLOR }, `context-hint-${index}`))), commandSuggestionLines.map((line, index) => (_jsx(Text, { color: INPUT_PANE_HINT_COLOR, children: line }, `operator-command-suggestion-${index}`))), _jsx(OperatorTextArea, { value: inputValue, onChange: setInputValue, onSubmit: handleSubmit, focus: !snapshot.shuttingDown, contentWidth: contentWidth, promptPrefix: operatorPrompt, maxDisplayLines: maxInputDisplayLines, onDisplayLineCountChange: handleDisplayLineCountChange, cursorStart: cursorStart })] }), _jsx(WorkerStatusPane, { workers: snapshot.displayState.workers, dispatchHold: snapshot.displayState.dispatchHold, height: streamPaneHeights.workerPaneHeight, terminalColumns: terminalColumns, issueUrl: issueUrl, issueLinkMode: issueLinkMode })] })] }));
210
+ const handleInputChange = (value) => {
211
+ setInputValue(value);
212
+ setSelectedCommandIndex(0);
213
+ setSelectedAnswerSuggestionIndex(0);
214
+ setHiddenAnswerSuggestionQuestionId(undefined);
215
+ };
216
+ const handleSuggestionTab = (shift) => {
217
+ if (shift) {
218
+ return;
219
+ }
220
+ if (commandSuggestions.length > 0) {
221
+ const selectedCommand = commandSuggestions[selectedCommandIndex];
222
+ if (!selectedCommand) {
223
+ return;
224
+ }
225
+ setInputValue(selectedCommand.name);
226
+ setInputCursorPosition([0, selectedCommand.name.length]);
227
+ setSelectedCommandIndex(0);
228
+ return;
229
+ }
230
+ applyAnswerSuggestion();
231
+ };
232
+ return (_jsxs(_Fragment, { children: [_jsx(StaticActivityLog, { activityLog: snapshot.activityLog.slice(0, committedActivityCount), contentWidth: activityLogContentWidth, replayGeneration: snapshot.activityLogGeneration, issueLinkMode: issueLinkMode }), _jsxs(Box, { flexDirection: "column", width: terminalColumns, height: streamPaneHeights.dynamicFrameHeight, overflowX: "visible", overflowY: "hidden", children: [operatorInputDisplay.mode === 'withQuestions' ? (_jsx(OpenQuestionsPane, { layout: streamOpenQuestionsLayout, terminalColumns: terminalColumns, issueLinkMode: issueLinkMode })) : null, _jsxs(TitledBorderPane, { title: INPUT_PANE_TITLE, borderStyle: "single", borderColor: INPUT_PANE_BORDER_COLOR, paddingX: PANE_PADDING_X, height: streamPaneHeights.inputPaneHeight, terminalColumns: terminalColumns, children: [contextHintLines.map((line, index) => (_jsx(WrappedTextLines, { text: line, width: contentWidth, color: INPUT_PANE_HINT_COLOR }, `context-hint-${index}`))), commandSuggestionLines.map((line) => (_jsx(Text, { color: line.isSelected ? 'cyan' : INPUT_PANE_HINT_COLOR, bold: line.isSelected, children: line.text }, `operator-command-suggestion-${line.id}`))), answerSuggestionLines.map((line) => (_jsx(Text, { color: line.isSelected ? 'cyan' : INPUT_PANE_HINT_COLOR, bold: line.isSelected, children: line.text }, `open-question-answer-suggestion-${line.id}`))), _jsx(OperatorTextArea, { value: inputValue, onChange: handleInputChange, onSubmit: handleSubmit, focus: !snapshot.shuttingDown, contentWidth: contentWidth, promptPrefix: operatorPrompt, maxDisplayLines: maxInputDisplayLines, onDisplayLineCountChange: handleDisplayLineCountChange, suggestionsActive: commandSuggestions.length > 0 || answerSuggestions.length > 0, onTab: commandSuggestions.length > 0 || answerSuggestions.length > 0
233
+ ? handleSuggestionTab
234
+ : undefined, cursorPosition: inputCursorPosition, onCursorChange: setInputCursorPosition, cursorStart: cursorStart })] }), _jsx(WorkerStatusPane, { workers: snapshot.displayState.workers, dispatchHold: snapshot.displayState.dispatchHold, height: streamPaneHeights.workerPaneHeight, terminalColumns: terminalColumns, issueUrl: issueUrl, issueLinkMode: issueLinkMode })] })] }));
156
235
  }
157
236
  //# sourceMappingURL=issue-session-tui-stream.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"issue-session-tui-stream.js","sourceRoot":"","sources":["../../src/tui/issue-session-tui-stream.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"issue-session-tui-stream.js","sourceRoot":"","sources":["../../src/tui/issue-session-tui-stream.tsx"],"names":[],"mappings":"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"}
@@ -9,6 +9,7 @@ import { cleanup, render } from 'ink-testing-library';
9
9
  import { IssueSessionTuiStream } from './issue-session-tui-stream.js';
10
10
  import { createTuiViewModel } from './tui-view-model.js';
11
11
  import { flushInkStdin, INK_TEST_KEYS } from './ink-test-keys.js';
12
+ import { OPERATOR_INPUT_PROMPT } from './tui-layout-constants.js';
12
13
  import { createTuiResizeController, createTuiTerminalSizeStore, TUI_RESIZE_SETTLE_MS, TUI_RESIZE_SHRINK_COALESCE_MS, } from './tui-terminal-size.js';
13
14
  import { createTuiResizeRecovery, TUI_FULL_REDRAW_SEQUENCE, } from './tui-resize-recovery.js';
14
15
  class ResizeSource extends EventEmitter {
@@ -77,11 +78,125 @@ describe('IssueSessionTuiStream', () => {
77
78
  await flushInkStdin();
78
79
  expect(onSubmit).toHaveBeenCalledWith('/ex', undefined);
79
80
  });
81
+ it('selects a slash suggestion and Tab completes it without submitting', async () => {
82
+ const viewModel = createTuiViewModel();
83
+ const onSubmit = vi.fn();
84
+ const { stdin, lastFrame } = render(_jsx(IssueSessionTuiStream, { viewModel: viewModel, onSubmit: onSubmit }));
85
+ stdin.write('/cl');
86
+ await flushInkStdin();
87
+ expect(lastFrame() ?? '').toContain('› /close');
88
+ stdin.write(INK_TEST_KEYS.tab);
89
+ await flushInkStdin();
90
+ expect(lastFrame() ?? '').toContain(`${OPERATOR_INPUT_PROMPT}/close`);
91
+ expect(lastFrame() ?? '').not.toContain('operator> ');
92
+ expect(onSubmit).not.toHaveBeenCalled();
93
+ stdin.write('\r');
94
+ await flushInkStdin();
95
+ expect(onSubmit).toHaveBeenCalledWith('/close', undefined);
96
+ });
97
+ it.each([
98
+ {
99
+ name: 'choice',
100
+ question: createOpenQuestion({
101
+ id: 'inq-choice',
102
+ question: 'Choose a mode',
103
+ responseType: 'choice',
104
+ choices: [
105
+ { id: 'safe', label: 'Safe mode' },
106
+ { id: 'secure', label: 'Secure mode' },
107
+ { id: 'fast', label: 'Fast mode' },
108
+ ],
109
+ }),
110
+ prefix: 's',
111
+ completedValue: 'secure',
112
+ expectedSuggestion: 'safe: Safe mode',
113
+ hasMultipleSuggestions: true,
114
+ },
115
+ {
116
+ name: 'yes_no',
117
+ question: createOpenQuestion({
118
+ id: 'inq-yes-no',
119
+ question: 'Proceed?',
120
+ responseType: 'yes_no',
121
+ }),
122
+ prefix: 'n',
123
+ completedValue: 'no',
124
+ expectedSuggestion: 'no — いいえ',
125
+ hasMultipleSuggestions: false,
126
+ },
127
+ ])('completes and submits the selected $name answer in stream mode', async ({ question, prefix, completedValue, expectedSuggestion, hasMultipleSuggestions, }) => {
128
+ const viewModel = createTuiViewModel();
129
+ viewModel.setDisplayState({
130
+ workers: {},
131
+ conductorOutput: null,
132
+ openQuestions: [
133
+ question,
134
+ createOpenQuestion({
135
+ id: 'inq-text',
136
+ question: 'Anything else?',
137
+ }),
138
+ ],
139
+ dispatchHold: { hold: false, heldEventCount: 0 },
140
+ });
141
+ const onSubmit = vi.fn();
142
+ const { stdin, lastFrame } = render(_jsx(IssueSessionTuiStream, { viewModel: viewModel, onSubmit: onSubmit }));
143
+ stdin.write(prefix);
144
+ await flushInkStdin();
145
+ expect(lastFrame() ?? '').toContain(expectedSuggestion);
146
+ stdin.write(INK_TEST_KEYS.shiftDownArrow);
147
+ await flushInkStdin();
148
+ expect(lastFrame() ?? '').toContain('2/2');
149
+ expect(lastFrame() ?? '').not.toContain(`› ${expectedSuggestion}`);
150
+ stdin.write(INK_TEST_KEYS.shiftUpArrow);
151
+ await flushInkStdin();
152
+ expect(lastFrame() ?? '').toContain('1/2');
153
+ expect(lastFrame() ?? '').toContain(expectedSuggestion);
154
+ if (hasMultipleSuggestions) {
155
+ stdin.write(INK_TEST_KEYS.downArrow);
156
+ await flushInkStdin();
157
+ expect(lastFrame() ?? '').toContain('› secure: Secure mode');
158
+ }
159
+ stdin.write('\r');
160
+ await flushInkStdin();
161
+ expect(onSubmit).not.toHaveBeenCalled();
162
+ expect(lastFrame() ?? '').toContain(`${OPERATOR_INPUT_PROMPT}${completedValue}`);
163
+ expect(lastFrame() ?? '').not.toContain(`› ${completedValue}:`);
164
+ stdin.write(' because it is safer');
165
+ await flushInkStdin();
166
+ stdin.write('\r');
167
+ await flushInkStdin();
168
+ expect(onSubmit).toHaveBeenCalledWith(`${completedValue} because it is safer`, { targetOpenQuestionId: question.id });
169
+ });
170
+ it('prioritizes slash suggestions over answer suggestions in stream mode', async () => {
171
+ const viewModel = createTuiViewModel();
172
+ viewModel.setDisplayState({
173
+ workers: {},
174
+ conductorOutput: null,
175
+ openQuestions: [
176
+ createOpenQuestion({
177
+ id: 'inq-choice',
178
+ question: 'Choose a mode',
179
+ responseType: 'choice',
180
+ choices: [{ id: 'exit', label: 'Exit mode' }],
181
+ }),
182
+ ],
183
+ dispatchHold: { hold: false, heldEventCount: 0 },
184
+ });
185
+ const { stdin, lastFrame } = render(_jsx(IssueSessionTuiStream, { viewModel: viewModel, onSubmit: () => { } }));
186
+ stdin.write('/');
187
+ await flushInkStdin();
188
+ expect(lastFrame() ?? '').toContain('› /reconnect');
189
+ expect(lastFrame() ?? '').not.toContain('› exit: Exit mode');
190
+ });
80
191
  it('renders activity as unframed static output and keeps the lower panes framed', () => {
81
192
  const viewModel = createTuiViewModel();
82
193
  viewModel.setDisplayState({
83
194
  workers: {
84
- implementer: { kind: 'implementer', status: 'running' },
195
+ implementer: {
196
+ kind: 'implementer',
197
+ status: 'running',
198
+ activity: 'calling: Shell',
199
+ },
85
200
  },
86
201
  conductorOutput: null,
87
202
  openQuestions: [createOpenQuestion({ id: 'inq-1', question: 'Approve?' })],
@@ -94,13 +209,15 @@ describe('IssueSessionTuiStream', () => {
94
209
  expect(frame).toContain('[operator] operator ping');
95
210
  expect(frame).toContain('[conductor] conductor says hi');
96
211
  expect(frame).toContain('Workers');
212
+ expect(frame).toContain('implementer: running (calling: Shell)');
213
+ expect(frame).not.toContain('implementer (implementer)');
97
214
  expect(frame).toContain('Open questions');
98
215
  expect(frame).toContain('Operator input');
99
216
  expect(frame).not.toContain('Orchestration');
100
217
  expect(frame.indexOf('Open questions')).toBeLessThan(frame.indexOf('Operator input'));
101
218
  expect(frame.indexOf('Operator input')).toBeLessThan(frame.indexOf('Workers'));
102
219
  expect(frame).toContain('inq-1 (1/1) への回答');
103
- expect(frame).not.toContain('任意入力 · /reconnect · /close 保存して閉じる · /exit 掃除して終了');
220
+ expect(frame).not.toContain('任意入力');
104
221
  });
105
222
  it('keeps operator line and paragraph breaks in stream activity output', () => {
106
223
  const viewModel = createTuiViewModel({ activityLogWindowSize: null });
@@ -199,20 +316,20 @@ describe('IssueSessionTuiStream', () => {
199
316
  const { lastFrame } = render(_jsx(IssueSessionTuiStream, { viewModel: viewModel, onSubmit: () => { } }));
200
317
  expect(lastFrame() ?? '').toContain('conductor dispatch 保留中(4 件)');
201
318
  });
202
- it('shows the single-line post-loop prompt without waiting status', () => {
319
+ it('keeps the post-loop input area free of a fixed prompt', () => {
203
320
  const viewModel = createTuiViewModel();
204
321
  viewModel.setPostLoopWaiting(true);
205
322
  const { lastFrame } = render(_jsx(IssueSessionTuiStream, { viewModel: viewModel, issueUrl: "https://github.com/otolab/agents-ensemble/issues/261", issueLinkMode: "label", onSubmit: () => { } }));
206
323
  const frame = lastFrame() ?? '';
207
324
  const operatorInputIndex = frame.indexOf('Operator input');
208
- const instructionHintIndex = frame.indexOf('追加指示 · /reconnect · /close 保存して閉じる · /exit 掃除して終了');
209
325
  const workersIndex = frame.indexOf('Workers');
210
326
  expect(operatorInputIndex).toBeGreaterThanOrEqual(0);
211
327
  expect(frame).not.toContain('Open questions');
212
328
  expect(frame).not.toContain('(未回答なし)');
213
- expect(instructionHintIndex).toBeGreaterThan(operatorInputIndex);
214
329
  expect(workersIndex).toBeGreaterThan(operatorInputIndex);
215
- expect(frame).toContain('追加指示 · /reconnect · /close 保存して閉じる · /exit 掃除して終了');
330
+ expect(frame).toContain(OPERATOR_INPUT_PROMPT);
331
+ expect(frame).not.toContain('追加指示');
332
+ expect(frame).not.toContain('/reconnect');
216
333
  expect(frame).toContain('otolab/agents-ensemble#261');
217
334
  expect(frame).not.toContain('post-loop 待機中');
218
335
  expect(Math.max(...frame.split('\n').map((line) => line.trimEnd().length))).toBeLessThanOrEqual(80);
@@ -294,11 +411,9 @@ describe('IssueSessionTuiStream', () => {
294
411
  await flushInkStdin();
295
412
  expectCanonicalIssueUrl();
296
413
  const postLoopFrame = (lastFrame() ?? '').replace(/\s+/g, ' ');
297
- expect(postLoopFrame).toContain('追加指示 ·');
298
- expect(postLoopFrame).toContain('/close');
299
- expect(postLoopFrame).toContain('保存して閉じる');
300
- expect(postLoopFrame).toContain('/exit');
301
- expect(postLoopFrame).toContain('掃除して終了');
414
+ expect(postLoopFrame).toContain(OPERATOR_INPUT_PROMPT);
415
+ expect(postLoopFrame).not.toContain('追加指示');
416
+ expect(postLoopFrame).not.toContain('/reconnect');
302
417
  viewModel.setShuttingDown(true);
303
418
  await flushInkStdin();
304
419
  expectCanonicalIssueUrl();
@@ -381,17 +496,21 @@ describe('IssueSessionTuiStream', () => {
381
496
  viewModel.setPostLoopWaiting(true);
382
497
  await flushInkStdin();
383
498
  expectCanonicalIssueLink();
384
- expect(lastFrame() ?? '').toContain('追加指示 · /reconnect · /close 保存して閉じる · /exit 掃除して終了');
499
+ expect(lastFrame() ?? '').toContain(OPERATOR_INPUT_PROMPT);
500
+ expect(lastFrame() ?? '').not.toContain('追加指示');
501
+ expect(lastFrame() ?? '').not.toContain('/reconnect');
385
502
  viewModel.setShuttingDown(true);
386
503
  await flushInkStdin();
387
504
  expectCanonicalIssueLink();
388
505
  expect(lastFrame() ?? '').toContain('終了しています…');
389
506
  });
390
- it('shows the no-question hint before operator context binds', () => {
507
+ it('keeps the no-question input area blank before operator context binds', () => {
391
508
  const viewModel = createTuiViewModel();
392
509
  const { lastFrame } = render(_jsx(IssueSessionTuiStream, { viewModel: viewModel, issueUrl: "https://github.com/otolab/agents-ensemble/issues/261", issueLinkMode: "label", onSubmit: () => { } }));
393
510
  const frame = lastFrame() ?? '';
394
- expect(frame).toContain('任意入力 · /reconnect · /close 保存して閉じる · /exit 掃除して終了');
511
+ expect(frame).toContain(OPERATOR_INPUT_PROMPT);
512
+ expect(frame).not.toContain('任意入力');
513
+ expect(frame).not.toContain('/reconnect');
395
514
  expect(frame).not.toContain('自律ターン');
396
515
  });
397
516
  it('omits the open-question pane and keeps ordinary input available', async () => {
@@ -399,9 +518,11 @@ describe('IssueSessionTuiStream', () => {
399
518
  const onSubmit = vi.fn();
400
519
  const { stdin, lastFrame } = render(_jsx(IssueSessionTuiStream, { viewModel: viewModel, issueUrl: "https://github.com/otolab/agents-ensemble/issues/263", issueLinkMode: "label", onSubmit: onSubmit }));
401
520
  expect(lastFrame() ?? '').not.toContain('Open questions');
402
- expect(lastFrame() ?? '').toContain('任意入力 · /reconnect · /close 保存して閉じる · /exit 掃除して終了');
521
+ expect(lastFrame() ?? '').toContain(OPERATOR_INPUT_PROMPT);
522
+ expect(lastFrame() ?? '').not.toContain('任意入力');
523
+ expect(lastFrame() ?? '').not.toContain('/reconnect');
403
524
  expect(lastFrame() ?? '').toContain('otolab/agents-ensemble#263');
404
- expect(lastFrame() ?? '').not.toContain('otolab/agents-ensemble#263 — 任意入力 · /reconnect · /close 保存して閉じる · /exit 掃除して終了');
525
+ expect(lastFrame() ?? '').not.toContain('otolab/agents-ensemble#263 —');
405
526
  stdin.write('follow-up');
406
527
  await flushInkStdin();
407
528
  stdin.write('\r');
@@ -526,7 +647,7 @@ describe('IssueSessionTuiStream', () => {
526
647
  expect(countHistory(finalFrame)).toBe(1);
527
648
  expect(Math.max(...finalFrame.split('\n').map((line) => line.trimEnd().length))).toBeLessThanOrEqual(60);
528
649
  expect(finalFrame).toContain('Workers');
529
- expect(finalFrame).toContain('operator>');
650
+ expect(finalFrame).toContain(OPERATOR_INPUT_PROMPT);
530
651
  }
531
652
  finally {
532
653
  unsubscribe();
@@ -705,7 +826,7 @@ describe('IssueSessionTuiStream', () => {
705
826
  const initialFrame = lastFrame() ?? '';
706
827
  expect(initialFrame).toContain('Open questions');
707
828
  expect(initialFrame).toContain('inq-resumed-1');
708
- expect(initialFrame).not.toContain('任意入力 · /reconnect · /close 保存して閉じる · /exit 掃除して終了');
829
+ expect(initialFrame).not.toContain('任意入力');
709
830
  if (selectedIndex === 1) {
710
831
  stdin.write(INK_TEST_KEYS.shiftDownArrow);
711
832
  await flushInkStdin();
@@ -719,16 +840,18 @@ describe('IssueSessionTuiStream', () => {
719
840
  });
720
841
  if (restoredQuestions.length === 1) {
721
842
  expect(lastFrame() ?? '').not.toContain('Open questions');
722
- expect(lastFrame() ?? '').toContain('任意入力 · /reconnect · /close 保存して閉じる · /exit 掃除して終了');
843
+ expect(lastFrame() ?? '').toContain(OPERATOR_INPUT_PROMPT);
844
+ expect(lastFrame() ?? '').not.toContain('任意入力');
723
845
  }
724
846
  else {
725
847
  expect(lastFrame() ?? '').toContain('Open questions');
726
848
  expect(lastFrame() ?? '').toContain('inq-resumed-1');
727
- expect(lastFrame() ?? '').not.toContain('任意入力 · /reconnect · /close 保存して閉じる · /exit 掃除して終了');
849
+ expect(lastFrame() ?? '').not.toContain('任意入力');
728
850
  setOperatorQuestions([]);
729
851
  await flushInkStdin();
730
852
  expect(lastFrame() ?? '').not.toContain('Open questions');
731
- expect(lastFrame() ?? '').toContain('任意入力 · /reconnect · /close 保存して閉じる · /exit 掃除して終了');
853
+ expect(lastFrame() ?? '').toContain(OPERATOR_INPUT_PROMPT);
854
+ expect(lastFrame() ?? '').not.toContain('任意入力');
732
855
  }
733
856
  });
734
857
  it('keeps Shift+arrow open-question selection in stream mode', async () => {
@@ -743,8 +866,11 @@ describe('IssueSessionTuiStream', () => {
743
866
  dispatchHold: { hold: false, heldEventCount: 0 },
744
867
  });
745
868
  const { stdin, lastFrame } = render(_jsx(IssueSessionTuiStream, { viewModel: viewModel, onSubmit: () => { } }));
869
+ stdin.write('/');
870
+ await flushInkStdin();
746
871
  stdin.write(INK_TEST_KEYS.shiftDownArrow);
747
872
  await flushInkStdin();
873
+ expect(lastFrame() ?? '').toContain('› /reconnect');
748
874
  expect(lastFrame() ?? '').toContain('2/2');
749
875
  expect(lastFrame() ?? '').toContain('▸ inq-2');
750
876
  });